字符与整数相乘后赋值给字符变量为何得到-124?
字符变量与整数相乘后赋值的截断与溢出解析
先看你给出的代码:
char p= (98*'b') ; printf("%d",p);
一步步拆解原因:
计算原始值
'b'的ASCII码值是98,所以98*'b'等价于98*98=9604,这个结果是int类型(C语言中整数运算会自动提升到int,不会溢出)。赋值给char时的截断
多数系统中char是8位有符号整数,取值范围是-128到127。当把9604赋值给char时,只会保留数值的最低8位:- 计算9604对256(2^8)取模,得到132。
- 132的8位二进制是
10000100,最高位是符号位(1代表负数),按照补码规则转换为十进制就是132-256=-124。
关于你提到的“溢出”
这里确实发生了溢出,但不是乘法运算时的溢出(9604远小于int的取值范围),而是赋值到窄类型时的溢出截断。C标准中,有符号整数溢出属于未定义行为,但多数编译器会直接保留最低n位并按有符号规则解析,最终就得到了-124这个结果。
内容的提问来源于stack exchange,提问作者Adam z
相关产品推荐
相关产品推荐

