c语言中整型是如何存储的

   大家好,我是c语言boom家宝,今天为大家分享的是整型家族在c语言里到底是怎么存储的呢?

   相信小伙伴们在c语言的学习中,会有非常非常多的疑问,但是老师又不会带大家去深入了解这些的原理,只让大家去学习语法,然后体会编程逻辑,用这些语法再去完成程序的实现。所以今天家宝就带大家先简单了解一下c语言存储的知识。 

   首先,学习计算机的小伙伴们应当知道,计算机认识的数字是二进制,而不是我们通常使用的十进制形式。那么二进制数又是怎样从十进制数转换的呢?这里博主简单介绍一下:用2整除十进制整数,得到一个商和余数;再用2去除商,又会得到一个商和余数,如此重复,直到商为小于1时为止,然后把先得到余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,以此排列起来。如下:

       知道二进制的转换方式之后,我们现在需要知道的计算机整型数据的表现形式。分别是:原码、反码、补码。他们都是二进制数,因为是整型,所以有4个字节32个bit位,所以其余为补0,三种表现形式都是由符号位和数值位组成的。其中第一位数字就是符号位,其余31位为数值位。符号位为0,即表示该数值为正数。符号位为1,表示该数值为负数。

          接下来说说原码,反码,补码的计算规则。原码就是2进制,整形,4个字节,32比特位。正数原码,反码,补码相同。负数反码由原码的符号位不变,其他位按位取反得到,然后反码+1就是补码。整数在内存中存放的是补码,用来计算的也是补码。

      例如‘100’这个数字,转换成二进制就是1100100,补成原码就是00000000000000000000000001100100 一共32位。而他的反码和补码都和原码一样。

        那么负数呢。我们以‘-100’来举例。补成原码就是10000000000000000000000001100100,那么反码就是符号位1不变,其余31位取反,变成11111111111111111111111110011011,补码为反码+1等于11111111111111111111111110011100.

        重要的事情重复说:整数在内存中存放的是补码,用来计算的也是补码。所以我们通常需要把数值转换成补码。或许就会有小伙伴不相信了,说博主你怎么证明他存的就是补码呢?那博主在vs编译器里通过调试监控内存给大家看一下:

 这里得事先声明一下,本质上计算机内存存放的是二进制形式,但是vs编译器为了方便展示,使用的是十六进制。所以我们可以看看上述补码是否和这个相同。(四个二进制位等同1个十六进制位,所以32个二进制位显示出来的就是8个十二进制)。数字10转换成补码就是00000000000000000000000000001010,再转换成十六进制就是0x0000000a。0x是十六进制的开头,表示为该数是十六进制。所以不难看出,计算机整型内存的存储是使用的补码。

        但是也不难看出上述内存的显示与补码的表现形式顺序是相反的。这又是什么原因呢。这里就得介绍字节序了。字节序:是以字节为单位,讨论存储顺序的。分为大端和小端。


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

        而这个不是我们能决定它是大端还是小端的。只能说博主的内存使用的是小端字节序存储。所以才会倒过来展示。

        那为什么计算机要使用补码呢?原因在于,使用补码,可以做到将符号位和数值位进行统一处理。同时,加法和减法也可以做到统一处理(cpu只有加法器)。博主举一个简单的例子。比如计算1-1这个式子的值。那么计算机就会处理成1+(-1)来计算。感兴趣的小伙伴可以把它换成原码或者反码来计算,看看是否是正确答案。然后呢再换成补码计算,又是否能得到正确答案呢

猜你喜欢

转载自blog.csdn.net/m0_73321818/article/details/130905736