使用位操作检测负整数

Naw*_*waz 5 c c++ binary

检查给定整数是否为负的一种方法可能是:( 使用位操作)

int num_bits = sizeof(int) * 8; //assuming 8 bits per byte!
int sign_bit = given_int & (1 << (num_bits-1)); //sign_bit is either 1 or 0
if ( sign_bit )
{
     cout << "given integer is negative"<<endl;
}
else
{
     cout << "given integer is positive"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的问题是每字节的比特数不能是8,它可以是每个字节9,10,11甚至16或40比特.字节不一定意味着8位!无论如何,这个问题可以通过写作轻松解决,

//CHAR_BIT is defined in limits.h
int num_bits = sizeof(int) * CHAR_BIT; //no assumption. 
Run Code Online (Sandbox Code Playgroud)

现在好像很好.但它真的吗?这个标准符合吗?如果负整数不表示为2的补码怎么办?如果它是代表一个二进制记数系统,必要负整数有1个在它的最显著位?

我们可以编写既可移植又符合标准的代码?


相关主题:
原始数据类型的大小
为什么布尔1字节而不是1位大小?

R..*_*R.. 2

将整数转换为相应的无符号类型,然后您不必担心正在使用什么有符号表示形式。唯一剩下的问题是可能存在填充位。这是一个没有位移位的解决方案,因此不依赖于与位大小匹配的位宽度

#define IS_NEG(x) ((unsigned_type)x & (unsigned_type)-1-(unsigned_type)-1/2)
Run Code Online (Sandbox Code Playgroud)

  • 无符号整数的范围可能与有符号整数的范围相同,在这种情况下,宏将为 -1 和 INT_MAX 提供相同的结果。 (3认同)
  • 如果您在转换中使用“uintmax_t”,则不必担心“x”的原始类型。 (2认同)