关于c语言char a=129 输出时的问题 (通过补码规则进行理解)

以下纯属个人理解 (我也正在自学计算机基础知识属于菜鸟阶段 )
如有路过大佬还请指正

首先思考下面四种场景输出结果
#include <stdio.h>
int main(){
char a=129;//当 a=129 259 -130 -269 输出结果
printf(“%d\n”,a);
return 0;
}

char 取值范围是 -128到127 也就是8个二进制位 第一位是符号位 0表示正数 1表示负数 那么当我们给他赋值超过这个范围会怎么样 接下来我通过自己的理解进行梳理
首先明确相关规则
①计算机内部存储的是二进制补码数据
②计算机内部没有原码和反码的概念 只是便于人们理解计算机转换成补码增加的这两个概念
③正数补码是其二进制形式本身 对正数补码按位取反然后加1可得到对应负数补码 对负数补码进行按位取反加1也可以得到对应正数

当我们给a赋值129时
首先 129的二进制格式是1000 0001
然后我们将其赋值给 变量a(这里应该还涉及声明变量时内存开辟空间知识 不大懂。。。按照自己理解) 而此时 变量a的存储数据规则是 最长是8个二进制位 (bit为)并且第一个bit位是符号位
由于符号位是1 那么按照规则③对这个负数进行按位取反加1得到对应正数:0111 1111 不难得出这个数是127 最终输出-127

当我们赋值259时
259对应二进制是 0001 0000 0011 这超出了 a的范围 那么高位就要舍弃 所以赋值给a的是 0000 0011 是3 最后输出3

当我们赋值 -130时 首先确定130的二进制补码是 1000 0010
那么负数的补码就是对正数补码按位取反加1得到 0111 1110
然后将这个值赋值给变量a 由于符号位是0计算机会认为这是正数 那么这个数就是 126

当我们赋值 -269时 首先确定 269的二进制补码是 0001 0000 1101
然后取反加1得到 -269的补码 是 1110 1111 0011 然后赋值给a
超出范围高位舍弃 也就是 1111 0011 符号位是1那么计算机认为是负数
根据规则3 按位取反加1得到 0000 1101 是13 那么输出的就是 -13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值