C语言整数和浮点数在内存中的存储

一.整数

1.整数的概念(计算机)

  • 整数类型在内存中占用固定大小的字节数,例如int通常占用4个字节(32位)。这意味着可以表示的整数范围受到字节大小的限制。例如,32位有符号整数的范围通常是从-2,147,483,648到2,147,483,647。
  • 整数以二进制补码形式存储。在二进制补码表示中,最高位被用作符号位,0表示正数,1表示负数。其余的位表示数值的绝对值。这种表示方法使得负数的运算可以通过与正数相同的算术运算来处理。

整数的2进制表示方法有三种,即原码、反码和补码三种表示方法均有符号位和数值位两部分,符号位都是⽤0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。

2.原码

原码(Sign-Magnitude)是一种表示有符号整数的方法。在原码表示中,使用最高位作为符号位(0表示正数,1表示负数),其余位表示数值的绝对值。例如,+5的原码表示为00000101,-5的原码表示为10000101

3.反码

反码(One's Complement)是对原码的一种变换。反码表示中,正数的表示与原码相同,而负数的表示是将对应正数的每个位取反(0变为1,1变为0)。例如,+5的反码表示仍为00000101,-5的反码表示为11111010

4.补码

补码(Two's Complement)是对原码的另一种变换,也是计算机中最常用的表示有符号整数的方法。补码表示中,正数的表示与原码相同,而负数的表示是将对应正数的每个位取反,并在最后加1。例如,+5的补码表示仍为00000101,-5的补码表示为11111011

二.浮点数

1.浮点数的概念(计算机)

  • 浮点数类型在内存中同样占用固定大小的字节数,例如float通常占用4个字节(32位),double占用8个字节(64位)。
  • 浮点数的表示采用IEEE 754标准。IEEE 754定义了浮点数的二进制表示方法,其中包括了符号位、指数位和尾数位。这种表示方式使得浮点数能够表示很大或很小的数值,并具有一定的精度。
  • 在IEEE 754标准中,浮点数表示为科学计数法的形式:(-1)^s × m × 2^e,其中s是符号位,m是尾数位,e是指数位。不同的浮点数类型有不同的尾数位和指数位的位数,从而影响了它们的范围和精度。

IEEE 754标准形式如下:

V = (-1)^S∗M∗2^E 
• (-1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数。
• M表示有效数字,M是大于等于1,小于2的。
• 2^E表示指数位。

EEE 754标准定义了两种精度的浮点数类型:单精度(32位)和双精度(64位)。在存储浮点数时,将其分为三个部分:符号位、指数位和尾数位。

2.单精度浮点数(float)

  • 符号位(1位):用于表示正负号,0表示正数,1表示负数。
  • 指数位(8位):用于表示指数部分的偏移量。采用移位表示,偏移量为127,即真实指数值 = 指数位的值 - 127。
  • 尾数位(23位):用于表示小数部分的尾数。

3.双精度浮点数(double)

  • 符号位(1位):用于表示正负号,0表示正数,1表示负数。
  • 指数位(11位):用于表示指数部分的偏移量。采用移位表示,偏移量为1023,即真实指数值 = 指数位的值 - 1023。
  • 尾数位(52位):用于表示小数部分的尾数。

4.典型示例

下面是一个示例,展示了如何将十进制浮点数转换为IEEE 754标准的二进制表示:

十进制数:-27.375

  1. 确定符号位:负数,符号位为1。

  2. 将整数部分和小数部分转换为二进制数:

    2.1整数部分:27的二进制表示为11011。                                                                              2.2小数部分:0.375的二进制表示可以使用乘以2的方法转换,即0.375 * 2 = 0.75,小数部分的第一位为0;0.75 * 2 = 1.5,小数部分的第二位为1;0.5 * 2 = 1.0,小数部分的第三位为1。因此,小数部分的二进制表示为0.011
  3. 将整数部分和小数部分合并:11011.011

  4. 将小数点左移,使得只剩下一个非零位:1.1011011

  5. 将浮点数规格化为科学计数法形式:将小数点右移,直到只剩下一个非零位。在这个例子中,右移4位得到:0.00011011011

  6. 计算指数部分的偏移量:移动的位数为4,因此指数部分的偏移量为4 + 127 = 131。转换为8位二进制表示为10000011

  7. 将符号位、指数位和尾数位组合起来:

          7.1单精度浮点数(float):1 10000011 1011011000000000000000

          7.2双精度浮点数(double):1 10000000011 1011011000000000000000000000000000000000000000000000

这样,十进制数-27.375的单精度浮点数表示为11000001110110110000000000000000,双精度浮点数表示为110000000111011011000000000000000000000000000000000000000000000

需要注意的是,浮点数的二进制表示是近似值,可能无法精确地表示某些十进制数。并且,IEEE 754标准还定义了特殊的浮点数值,如正无穷大、负无穷大、NaN(不是一个数字)等。对于这些特殊值,指数位全为1,尾数位全为0或非零。

无论是整数还是浮点数,它们在内存中的存储方式都是以二进制形式表示的。然而,具体的二进制表示方法和内存布局可能因编译器、操作系统和硬件平台而异。在不同的系统中,整数和浮点数的存储方式可能会有所不同,但通常遵循某种标准。

猜你喜欢

转载自blog.csdn.net/z6665454/article/details/137124767