首页 文章

c中有符号int和无符号short的比较

提问于
浏览
-2

我知道当我们将signed与unsigned进行比较时,编译器会将我们的签名值转换为unsigned,当我们将short与int进行比较时,编译器会将较小的类型转换为较大的类型 . 但是我编写了这段代码来检查我们是否比较了一个有符号的int x = 0xdeadbeef和unsigned short y = 0xffff然后在将unsigned short转换为int后,我们在y的比较中应该有一个0x0000ffff,它应该小于x的无符号值 . 但是我的代码没有进入x大于y的if条件 . 有人可以向我解释原因吗?

代码链:

#include<iostream>
using namespace std;

int main (){

        unsigned int x=0xDEADBEEF;
        unsigned short y= 0xFFFF;

        if((signed)x > y)
                cout<<"X is larger"<<endl;

  return 0;
}

运行时,代码不会打印“X更大” .

1 回答

  • 0

    当您将 x 从无符号转换为有符号时,会导致整数溢出 . 请注意, signed int 可以包含比 unsigned int 更小的正值 . 因此,当发生整数溢出时,在大多数平台上,它开始像你的汽车's odometer. i.e. once the int value exceeds the max it can store, it starts from the beginning. The '一样开始'如果32位系统上的signed int(int32)将是 -2,147,483,648 .

    所以在你的情况下,x是0xDEADBEEF或3,735,928,559 . 32位系统上的unsigned int可以存储该值 . 但是,当它被类型转换为 signed 时,会导致溢出,因此上述规则适用并将该值转换为-1,588,444,912 . 由于它是负数,因此 if 语句中的条件不满足,因此您的语句永远不会被打印 .

相关问题