C++-获取以整数位为单位的大小

C++ - Getting size in bits of integer

本文关键字:为单位 获取 整数 C++-      更新时间:2023-10-16

我需要知道一个整数是否为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是一个无符号的int数组

感谢

std::numeric_limits<unsigned>::digits

是一个静态整数常数(或C++11中的constexpr),给出位数(由于无符号存储在基数2中,所以它给出二进制数字)。

你需要#include <limits>才能得到这个,你会注意到这给出了与Thomas的答案相同的值(同时也可以推广到其他基元类型)


作为参考(我回答后您更改了问题),给定程序中给定类型(例如unsigned)的每个整数大小完全相同

您现在要问的不是以位为单位的整数的大小,因为这永远不会改变,而是是否设置了最高位。你可以用进行琐碎的测试

bool isTopBitSet(uint32_t v) {
  return v & 0x80000000u;
}

(如果您想推广到除uint32_t之外的无符号T,请用类似T{1} << (std::numeric_limits<T>::digits-1)的东西替换无符号十六进制文字)。

正如@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");中。

试试这个:

#include <climits>
unsigned int bits_per_byte = CHAR_BIT;
unsigned int bits_per_integer = CHAR_BIT * sizeof(int);

标识符CCD_ 10表示CCD_。

sizeof返回整数所占据的字符位置的数量。

将它们相乘可以得到整数的位数。

OP说"如果它正好是32位长(8个十六进制字符)",并进一步说"…有兴趣知道这个值是否在幂(2,31)和幂(2、32)-1之间"。所以它在负32位数字上有点模糊。

当然,OP希望知道基于值而不是类型的结果。

bool integer_is_32_bits_long(int x) = 
    // cope with 32-bit int
    ((INT_MAX == 0x7FFFFFFF) && (x < 0)) ||
    // larger 32-bit int
    ((INT_MAX >  0x7FFFFFFF) && (x >= 0x80000000) && (x <= 0xFFFFFFFF));

当然,如果int是16位,那么结果总是false

我想知道它是否正好是32位长(8个十六进制字符)

我有兴趣知道这个值是否在功率(2,31)和功率(2、32)-1 之间

所以你想知道高位是否设置好了吗?然后你可以简单地测试数字是否为负数:

bool upperBitSet(int x)
{
    return x < 0;
}

对于无符号数字,你可以简单地左移右移,然后检查你是否丢失了数据:

bool upperBitSet(unsigned x)
{
    return (x << 1 >> 1) != x;
}

最简单的方法可能是检查是否设置了第32位:

bool isReally32bitsLong(uint32_t in) {
  return (in >> 31)!=0;
}
bool isExactly32BitsLong(uint64_t in) {
  return ((in >> 31)!=0) && ((in >> 32) == 0);
}