首页 > 解决方案 > 为什么 0x1 被解释为小于 0xC0000000?

问题描述

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

我想知道为什么我必须将值转换0xC0000000为 anint以便在我传递参数时让我的函数正常工作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;
}

标签: cbinaryintegerhexbit-manipulation

解决方案


C 中的十六进制(和八进制)文字使用可以容纳该值的最小提升(=int或更高等级的类型)类型(有符号或无符号)进行类型化。这与十进制文字不同,十进制文字如果没有u/U后缀则保留在有符号类型中,否则保留在无符号类型中(6.4.4.1p5):

整数文字类型

这使得0xC0000000在具有 32 位整数的系统上无符号并比较(或以其他方式通过运算符配对)具有相同等级的有符号的无符号强制有符号变为无符号(​​6.3.1.8),因此没有强制转换(int)你得到一个隐含的(unsigned int)x < (unsigned int) 0xC0000000.


推荐阅读