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

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务