获取整数大小(以位为单位)

问题描述 投票:0回答:6

我需要知道一个整数是否是32位长(我想知道它是否正好是32位长(8个十六进制字符))。

如何在 C++ 中实现这一目标?我应该使用十六进制表示形式还是使用 unsigned int 表示形式来执行此操作?

我的代码如下:

mistream.open("myfile.txt");

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

mistream.close();

其中

mistream
ifstream
类型,
datos
是一个无符号 int 数组。

c++ c integer hex ifstream
6个回答
24
投票
std::numeric_limits<unsigned>::digits

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

您需要

#include <limits>
才能得到这个,并且您会注意到 here 这给出了与 Thomas 的答案相同的值(同时也可以推广到其他原始类型)


供参考(我回答后你改变了你的问题),给定程序中给定类型的每个整数(例如,

unsigned
的大小完全相同

您现在要问的不是整数的“大小”(以位为单位),因为它永远不会变化,而是是否设置了最高位。你可以用简单地测试一下 bool isTopBitSet(uint32_t v) { return v & 0x80000000u; }

(如果您想推广到除 
T{1} << (std::numeric_limits<T>::digits-1)

之外的无符号 T,请将无符号十六进制文字替换为

uint32_t
之类的内容)。
    


8
投票
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");
中。
    


5
投票

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

标识符
CHAR_BIT

表示

char
中的位数。

sizeof

返回整数占用的字符位置数。


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


0
投票

当然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
    


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

我有兴趣知道该值是否在 power(2, 31) 和 power(2, 32) - 1 之间

那么您想知道高位是否已设置?然后你可以简单地测试该数字是否为负数:

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

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

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



-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.