C语言 - 整形在内存中的存储方式

一.以补码的形式存储在内存当中

1.有符号型的整数二进制首位0表示正,1表示负数;

2.正数的原码、反码、补码都相同,如:

        

3.负数的反码为原码的首位数不变,其他位按位取反所得,补码为反码+1,如:

        

        当然,要得到负数的原码,可以反过来,即补码-1再取反,也可以和原码转补码那样用补码取反+1,这种转换往往更加轻松。

二.大端存储和小端存储

1.大端存储:把一个数据的低位字节内容存放在高地址处,高位字节的内容存放在低地址处;

2.小端存储:把一个数据的高位字节内容存放在高地址处,低位字节的内容存放在低地址处;

3.举例:

    

 图中从上往下和从左往右看内存为由低到高的地址,a的值为0x00 00 00 14,在图中却倒着存储。

 其中,0x14为一个字节,同时也是a的最低位字节,将它存储在了低地址处,而其他的 00 00 00其实也按顺序一步步存储了进去,所以我们按顺序看为0x14 00 00 00,是反过来了的。

 如果用的是用大端存储的话,得到的结果则与小端存储相反。

三.用补码来存储数据的原因

        首先我们得理解一个概念:C语言中CPU计算只有加法。就算是简单的1-1也要转换成1+(-1)的形式,仔细一想,如果我们都用原码相加,结果如下:

10000000000000000000000000000001(-1原码)+

00000000000000000000000000000001( 1原码)=10000000000000000000000000000010

那么得到的将会是一些奇奇怪怪的数字,而如果以补码的方式来计算:

11111111111111111111111111111111(-1补码)+

00000000000000000000000000000001( 1补码)=1 00000000000000000000000000000000

(此时由于数值溢出,使得最高位的1溢出丢失)

以补码的形式则可以避免这种情况,做到只用加法也能进行加减乘除的运算,以便减轻硬件的负担。

猜你喜欢

转载自blog.csdn.net/qq_74641564/article/details/128538741
今日推荐