为何可给unsigned int赋值负值?代码输出0而非10的原因
无符号整数赋值负数与计算结果异常的原因分析
你的实验代码如下:
#include <stdio.h> int main(){ unsigned int x,y,z; if(1){ x=-5; y=5; z=x+y; printf("%i",z); } return 0; }
1. 为什么能给unsigned int赋值负值?
在C语言中,将有符号负数赋值给无符号整数类型时,会触发标准定义的隐式转换规则:负数会被转换为该无符号类型可表示的最大值加1的模。
以32位unsigned int为例,其取值范围是0 ~ 4294967295(即0 ~ 2^32-1),赋值x=-5时,实际计算为2^32 + (-5),结果是4294967291,这个值会被正常存储到x中。编译器不会报错,这是完全符合C标准的行为。
2. 为什么计算结果是0而非10?
你错误地将unsigned int变量当成有符号整数来计算,忽略了无符号类型的溢出特性:
- 转换后的x是无符号值
4294967291,加上y的5后,总和为4294967296(即2^32) - 由于
unsigned int的取值上限是2^32-1,当数值溢出时会自动对2^32取模,4294967296 % 2^32 = 0,因此z的值为0 - 最后用
printf("%i", z)输出时,%i用于打印有符号整数,但0的有符号与无符号表示完全一致,所以最终打印结果为0。
内容的提问来源于stack exchange,提问作者Cblue X
相关产品推荐
相关产品推荐

