You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

原因解析

  1. Turbo C中char默认是有符号类型(signed char):
    初始值a=511在Turbo C的2字节int中二进制为0000 0001 1111 1111,由于Turbo C采用小端存储,低地址存放低字节,字符指针cp指向的是a的低字节1111 1111。
  2. 有符号char的补码规则:
    1111 1111作为signed char的二进制是补码形式,对应的十进制值为-1(补码转原码:符号位不变,其余位取反加1,得到1000 0001,即-1)。
  3. 整数赋值时的符号扩展:
    当把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:17:12