我需要知道一个整数的长度是否为32位(我想知道它是否恰好是32位的长度(8个十六进制字符)。我如何在C++中实现这一点?我应该用十六进制表示还是用无符号整型表示?
我的代码如下:
mistream.open("myfile.txt");
if(mistream)
{
for(int i=0; i<longArray; i++)
{
mistream >> hex >> datos[i];
}
}
mistream.close();其中mistream是ifstream类型,datos是无符号整型数组
谢谢
发布于 2015-03-27 01:58:25
std::numeric_limits<unsigned>::digits是一个静态整数常量(或C++11中的常量base ),给出位数(因为无符号存储在基数2中,它给出二进制数字)。
你需要对答案进行#include <limits>,你会注意到here给出了与托马斯的答案相同的值(同时也可以推广到其他原始类型)
作为参考(您在我回答后更改了您的问题),给定程序中给定类型(例如unsigned)的每个整数的大小完全相同。
您现在询问的不是整数的位数大小,因为它永远不会变化,而是最高位是否已设置。您可以使用以下命令对此进行简单的测试
bool isTopBitSet(uint32_t v) {
return v & 0x80000000u;
}(如果您想推广到uint32_t以外的无符号T,请将无符号十六进制文字替换为类似于T{1} << (std::numeric_limits<T>::digits-1)的内容)。
发布于 2015-03-27 02:02:14
正如@chux在注释中所暗示的那样,您可以组合使用sizeof运算符和CHAR_BIT宏常量。前者告诉您(在编译时)其参数类型的大小(以sizeof(char)和字节的倍数表示)。后者是字节的位数(通常为8位)。
您可以很好地将其封装到函数模板中。
#include <climits> // CHAR_BIT
#include <cstddef> // std::size_t
#include <iostream> // std::cout, std::endl
template <typename T>
constexpr std::size_t
bit_size() noexcept
{
return sizeof(T) * CHAR_BIT;
}
int
main()
{
std::cout << bit_size<int>() << std::endl;
std::cout << bit_size<long>() << std::endl;
}在我的实现中,它输出32和64。
由于该函数是一个constexpr,因此可以在静态上下文中使用它,例如在static_assert<bit_size<int>() >= 32, "too small");中。
发布于 2015-03-27 01:58:26
试试这个:
#include <climits>
unsigned int bits_per_byte = CHAR_BIT;
unsigned int bits_per_integer = CHAR_BIT * sizeof(int);标识符CHAR_BIT表示char中的比特数。
sizeof返回整数占用的字符位置数。
将它们相乘得到一个整数的位数。
https://stackoverflow.com/questions/29285287
复制相似问题