有符号数和无符号数的比较

int a = -1;

unsigned int b = 1;

printf("%d", a > b);

输出结果为1。

分析:有符号数和无符号数比较时,会将有符号数转化为无符号数进行比较(比较的是两者的补码),故而a<b

char a = -1;

unsigned char b = 1;

printf("%d", a > b);

输出结果为0。

分析:小类型之间进行数据比较时,会发生整型提升。a发生整型提升后,想当于int a=-1;b发生整型提升后相当于int b=1。所以这里的结果为a<b

整型提升的规则如下:以char为例子,不管对于有符号char还是无符号char,我们都希望它发生整型提升后的值保持不变,比如 char a=-1,我们希望发生整型提升后a的值还是-1,又如 unsigned char b=1,我们希望发生整型提升后b的值还是1。故而整型提升的规则设计如下:

1)对于无符号unsigned char a=1,我们在它的前面全部填充0使之变为4个字节,这样发生整型提升后a的值仍然为1

2)对于有符号char b=1,由于b为正数,所以我们在它的前面全部填充0使之变为4个字节,这样发生整型提升后a的值仍然为1

3)对于有符号char c=-1,由于c为正数,为了保证c在发生整型提升之后值仍然为-1,那就只能在它的前面全部补132bit数的模为232次方,所以想要求-1的补码,直接用232次方减去1即可,故而在前面全部补1是非常正确的)。

int a = -1;

unsigned char b = -1;

printf("%d\n", a < b);

输出结果为1

分析:b存的是-1,从无符号数的角度去看,它的值为0xFF,发生整型提升后,b的类型实际上是有符号的int,而不是无符号int,所以这里不会发生有符号数和无符号数比较的情况。故而a<b

char a = -1;

unsigned int b = -1;

printf("%d\n", a == b);

输出结果为1

分析:a发生整型提升后其结果还是为int类型的-1,然后发生有符号数和无符号数比较的情况,两者补码相同,故而结果a==b

全部评论

相关推荐

07-11 11:10
门头沟学院 Java
请问各位大三兄弟们跟hr说多久实习时间到时候可以提前跑路吗?
程序员小白条:问就是六个月以上,可以一年,实习都这样,你入职后想跑就跑
点赞 评论 收藏
分享
07-09 19:25
门头沟学院 Java
这是要把每一个投校招的都开盒吗?
26届之耻将大局逆转:裁人的时候一次性追回餐费
点赞 评论 收藏
分享
Lorn的意义:你这标个前端是想找全栈吗?而且项目确实没什么含金量,技术栈太少了,边沉淀边找吧 现在学院本想就业好一点四年至少得高三模式两年加油吧
点赞 评论 收藏
分享
06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务