为什么0x1解释为小于0xC0000000?

问题描述 投票:2回答:2

我正在学习整数的二进制表示形式,并试图编写一个函数,该函数使用饱和度返回int乘以2的结果。思考过程是,如果值正溢出,则函数返回INT_MAX,反之,如果值负溢出,则返回INT_MIN。在所有其他情况下,二进制值左移1。

我想知道为什么我必须将值0xC0000000强制转换为int才能使我的函数在传递参数x = 1时正常工作。

这是我的职能:

int timestwo (int x){
    if(x >= 0x40000000) // INT_MAX/2 + 1
        return 0x7fffffff; // INT_MAX
    else if(x < (int) 0xC0000000) // INT_MIN/2
        return 0x80000000; // INT_MIN
    else
        return x << 1;
    return 0;
}
c binary integer hex bit-manipulation
2个回答
1
投票

由常数0xC0000000指定的值将不适合int(假定为32位),但确实适合unsigned int,因此此常数的类型为unsigned int。此无符号值大于1,因此比较结果为false。

强制转换为int的结果实际上是实现定义的,尽管在二进制补码系统上,这通常会产生您期望的结果。


0
投票

C中的十六进制(和八进制)文字是使用可以容纳该值的最小提升型(= int或具有更高秩的)类型(带符号或无符号)键入的。这与十进制字面量不同,十进制字面量如果不带u / U后缀,则保留在带符号的类型中;否则,则不包含在无符号的类型中(6.4.4.1p5):

integer-literal types

[这将使0xC0000000在具有32位整数的无符号系统上进行比较(或通过运算符进行配对),并且将无符号的具有相同等级的符号强制将有符号变为无符号(6.3.1.8),因此如果没有(int)强制转换,则会得到隐式的(unsigned int)x < (unsigned int) 0xC0000000

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