关于unsigned int与char执行>、+运算结果的技术疑问
有符号与无符号类型隐式转换导致的结果解析
先贴出你提供的代码:
#include <stdio.h> int main(void) { unsigned int n = 10; char m = -1; if (m < n) printf("m < n\n"); else printf("m > n\n"); printf("m + n = %u\n", m + n); return 0; }
为什么输出"m > n"?
C语言有明确的类型提升规则:当有符号类型和无符号类型进行比较或运算时,有符号类型会被隐式转换为无符号类型。
这里m是有符号char类型的-1,MinGW64环境中char默认是8位有符号,它的二进制补码是0xff。和unsigned int类型的n比较时,m会被提升为unsigned int类型——8位的0xff扩展到32位就是0xffffffff,这个值作为无符号数是4294967295,远大于n的10,所以条件判断进入else分支,输出"m > n"。
为什么输出"m + n = 9"?
加法运算同样遵循类型转换规则:m被转换为unsigned int的0xffffffff,和n的10相加:0xffffffff + 10 = 0x100000009
但unsigned int是32位类型,超出32位的部分会被截断(无符号整数溢出属于定义行为,直接取模2^32),最终结果变成0x00000009,也就是十进制的9,所以输出"m + n = 9"。
内容的提问来源于stack exchange,提问作者flywen
相关产品推荐
相关产品推荐

