您的位置:首页 > 其它

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

2015-12-13 15:53 477 查看
之前一直不理解数据在内存中的存储方式,只知道教科书上写死的是整数在内存中以补码形式储存,所谓的补码就是根据整数的原码,正数的补码就是原码本身,负数则是原码除符号位外每一位都取反然后加一,例如整数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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: