一个小菜鸟对数据在内存中的二进制存储的理解

之前一直不理解数据在内存中的存储方式,只知道教科书上写死的是整数在内存中以补码形式储存,所谓的补码就是根据整数的原码,正数的补码就是原码本身,负数则是原码除符号位外每一位都取反然后加一,例如整数10 以8位二进制表示时的原码为00001010,则按照补码的转换规则,其补码为00001010,-10的补码为11110110。

但是只有这么一种感性的认识,并没有亲身实验过,今天突然心血来潮就写了个小程序,从开始的不理解,后来查了些资料,想通了不少,特此记录下,若有不对的地方万望指出,废话不多说,先上简单代码,本例用short类型来测试,本屌的机子上sizeof(short)为2个字节


然后运行结果:


首先明确有符号位的short类型的数据可表示的长度为1000 0000 0000 0000~0111 1111 1111 1111也就是-32768~32767,最高位为符号位,不参与计算。

对于i来说,i是short可表示的最大正数,所以输出的是32767;

对于j,32768可表示为32767+1,32767的原码为0111 1111 1111 1111,在计算机里的储存方式为补码即0111 1111 1111 1111,加一后变成1000 0000 0000 0000即

-32768,故输出为-32768;

对于k, -32768是short可表示的最小值,查了下资料,说是所有补码体系中没有代码与该值重合,于是就人为的定义为负值的最小值了。

对于x,-32769可表示为-32767-2,-32767原码为1111 1111 1111 1111,补码为1000 0000 0000 0001,减2后变成0111 1111 1111 1111也就是32767了;

对于y, 32769可表示为32767+2,32767原码为0111 1111 1111 1111,补码和原码一样,加2后同理变成-32767了;

对于g, 并没有溢出所以输出-32767.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值