C++ - 以整数位获取大小

fer*_*ral 5 c c++ hex integer ifstream

我需要知道一个整数是否是32位长(我想知道它是否正好是32位长(8个十六进制字符).我怎样才能在C++中实现这个?我应该用十六进制表示还是用无符号表示int one?

我的代码如下:mistream.open("myfile.txt");

mistream.open("myfile.txt");

if(mistream)
{
    for(int i=0; i<longArray; i++)
    {
        mistream >> hex >> datos[i];        
    }
}

mistream.close();
Run Code Online (Sandbox Code Playgroud)

其中mistream的类型为ifstream,而datos是unsigned int数组

谢谢

Use*_*ess 16

std::numeric_limits<unsigned>::digits
Run Code Online (Sandbox Code Playgroud)

是一个静态整数常量(或C++ 11中的constexpr)给出位数(因为无符号存储在基数2中,它给出二进制数字).

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


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

你现在要问的不是以位为单位的整数的大小,因为它永远不会变化,但是是否设置了最高位.你可以用这个简单的测试

bool isTopBitSet(uint32_t v) {
  return v & 0x80000000u;
}
Run Code Online (Sandbox Code Playgroud)

(将无符号的十六进制文字替换为类似的东西,T{1} << (std::numeric_limits<T>::digits-1)如果你想要概括为除了以外的无符号T uint32_t).


Tho*_*ews 5

尝试这个:

#include <climits>

unsigned int bits_per_byte = CHAR_BIT;
unsigned int bits_per_integer = CHAR_BIT * sizeof(int);
Run Code Online (Sandbox Code Playgroud)

标识符CHAR_BIT表示 中的位数char

返回该sizeof整数占用的 char 位置的数量。

将它们相乘即可得出整数的位数。


5go*_*der 5

正如@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;
}
Run Code Online (Sandbox Code Playgroud)

在我的实现中,它输出 32 和 64。

由于函数是 a constexpr,您可以在静态上下文中使用它,例如 in static_assert<bit_size<int>() >= 32, "too small");


Chr*_*zig -2

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

bool isReally32bitsLong(uint32_t in) {
  return (in >> 31)!=0;
}

bool isExactly32BitsLong(uint64_t in) {
  return ((in >> 31)!=0) && ((in >> 32) == 0);
}
Run Code Online (Sandbox Code Playgroud)

  • `1UL &lt;&lt; 32` 是一个潜在的问题。 (2认同)
  • 不,这显然是个问题。 (2认同)