有符号和无符号整数如何存储在c中?

Omk*_*ant 6 c

我试图运行以下代码,但与这里发生的事情混淆:

int main()
{
 /* 
    a = -1; 
    b = 0xffffffff; 
 */
if(-1 == 0xffffffff )
        printf("-1 is equal to maximum\n");
else
        printf(" -1 is not equal to maximum\n");

if(0xff < -1)
        printf(" Less than -1 \n");
if(0xff < 0xffffffff)
        printf(" Less than maximum\n");
Run Code Online (Sandbox Code Playgroud)

我也尝试了注释部分,用"a"替换-1,用"b"替换0xffffffff但结果相同.

这是32位系统所以我采用整数大小4字节.

我的输出是:

-1 is equal to maximum
 Less than maximum
Run Code Online (Sandbox Code Playgroud)

如果-1等于最大值,那么它应该执行最后两个if语句.但它没有发生.为什么?

Ker*_* SB 5

我将从C++中引用它; 我认为对C来说是一样的:

文字-1总是一个signed int.

文字0xff是一个signed int,但是0xffffffffunsigned int.

在比较混合符号时,两个操作数都转换为无符号,解释所有结果.

这是关于C++ 11,表6中的裸整数文字类型(即没有类型后缀)的规则:

  • 十进制文字是最小的类型int,long int或者long long int,无论哪种适合.

  • 十六进制文字是最小的类型中int,unsigned int,long int,unsigned long int,long long int,unsigned long long int,取其适合.

再说一遍:

  • 在您的第一次比较中,双方都转换为unsigned int,给出价值0xFFFFFFFF.

  • 在第二个比较中,两个术语都是有符号整数,左边是术语255,右边是-1.

  • 在第三个比较中,两个术语都转换为unsigned int.


请注意,我们永远不必担心这个问题的签名的硬件实现.唯一相关的平台相关的值的大小int,当我们宣称我们使用0xffffffff不适合的int,但适合的unsigned int.