signed与unsigned int、char的区别及无符号整型循环问题咨询
signed与unsigned类型区别及代码行为分析
1. signed和unsigned类型的核心差异
两者的本质区别是存储时对最高位的定义不同,衍生的特性差异如下:
- 符号支持:
signed类型最高位为符号位,0代表正数、1代表负数,可以表示正负值;unsigned类型所有比特位都用来存储数值,没有符号位,仅能表示非负数值。 - 取值范围:
- 32位环境下:
signed int取值范围为-2147483648 ~ 2147483647,unsigned int取值范围为0 ~ 4294967295 - 8位环境下:
signed char取值范围为-128 ~ 127,unsigned char取值范围为0 ~ 255
- 32位环境下:
- 运算规则:
unsigned类型的运算遵循无符号回绕规则,当运算结果小于0时,会自动加上2^N(N为该类型的比特位宽度),最终结果始终为非负值。
2. 示例代码的运行行为
你的判断是对的,这段代码会陷入无限循环,运行逻辑如下:
初始
unsigned int n = 3,循环依次输出3、2、1、0;当n为0时执行n = n - 1,因为n是无符号类型,不会得到-1,而是触发回绕得到unsigned int的最大值4294967295(32位环境),该值仍然满足n >= 0的判断条件,循环永远不会终止。
额外注意你的代码存在格式符不匹配问题:printf("%d", n)的%d对应参数类型是signed int,当n回绕到无符号最大值时,用%d输出会被解析为-1,后续你会依次看到-2、-3等输出,这只是格式化显示的结果,本质上n的值始终是非负的,不会触发循环退出。
如果要修复无限循环问题,可将循环条件改为n > 0,或者将n的类型改为signed int即可。
内容的提问来源于stack exchange,提问作者synth
相关产品推荐
相关产品推荐

