Turbo C编译器中代码输出266 -1 10,为何b的值为-1?
代码输出疑问解答
代码示例
int main(){ int a, b; char *cp; a = 511; cp = &a; b = *cp; *cp = 10; printf("%d %d %d", a,b,*cp); return 0; }
问题描述
上述代码在Turbo C编译器中的输出为266 -1 10。已知a=266是因为a的低字节被替换为10的二进制值,最终a的二进制为0000 0001 0000 1010,但无法理解为何b的值为-1:执行b = *cp时,*cp的二进制为1111 1111,复制给b后结果却是-1。
原因解析
- Turbo C中char默认是有符号类型(signed char):
初始值a=511在Turbo C的2字节int中二进制为0000 0001 1111 1111,由于Turbo C采用小端存储,低地址存放低字节,字符指针cp指向的是a的低字节1111 1111。 - 有符号char的补码规则:
1111 1111作为signed char的二进制是补码形式,对应的十进制值为-1(补码转原码:符号位不变,其余位取反加1,得到1000 0001,即-1)。 - 整数赋值时的符号扩展:
当把signed char类型的*cp赋值给int类型的b时,会触发符号扩展——因为原字符的符号位是1(表示负数),扩展为int时高位全部补1,最终b的二进制为1111 1111 1111 1111,这作为int的补码对应的十进制值仍是-1。
如果将char *cp改为unsigned char *cp,*cp会被当作无符号数255,赋值给b时高位补0,b的值就会变为255。
内容的提问来源于stack exchange,提问作者JoshuvaBernard
相关产品推荐
相关产品推荐

