整数在内存的存储方式

  • 符号位用0表示正,1表示负。
  • 整数在内存中是以补码的形式保存的(正数的源反补码相同,负数的源反补码不同)
  • 注意:变量类型在读取时会有一个整形提升的问题

    • 整形提升在存储变量时是没有的,只在读取时存在
    • 例如:char类型的数,输出的用%d整形输出。
  • 整形提升时,有符号类型根据首位进行补位,无符号类型补0。
  • 整形提升后,注意正数的源反补码相同。
int main()
{
    char b = 229;
 //存储时:229是正数,源反补码都相同
    //0000 0000 0000 0000 0000 0000 1110 0101  正数首位为0,其余位补0
    //b内存中存储的是:1110 0101
    
 //读取时,char类型打印为整型,整型提升
 //%d 表示有符号整形,首位为符号位,1110 0101首位为1,负数
 //如果是打印 %u 打印无符号整形,所有位都为数值位,源反补码相同。 
//char类型为有符号类型,根据首位决定补什么
   //补码:1111 1111 1111 1111 1111 1111 1110 0101 首位为1,全部补1
   //反码:1111 1111 1111 1111 1111 1111 1110 0100  补码减一
   //源码:1000 0000 0000 0000 0000 0000 0001 1011  取反
//输出的值: -27
   
    printf("%d",b);
    return 0;
}

大小端字节序存储

  • 以字节为单元进行存储。
0x12345678  十六进制位  12是最高位字节的数据,78是最低位字节的数据
大端存储: 低位  12 34 56 78 高位   把高位字节数据存放在低位处
小端存储: 低位  78 56 34 12 高位   把低位字节数据存放在低位处

浮点型在内存中的存储

  • 注意:浮点数在内存中可能不能精确保存,所以一般不用 == 号进行比较,一般是用差值,看是否在一定范围内。

存储浮点数时

  • 整数和浮点数在内存中的存储方式是有差异的。
  • 根据国际IEEE754的标准:任意二进制浮点数都可以表示成下列形式。
浮点数的计数方式:(-1)^S*M*2^E
(-1)^S表示符号位,S为0,则为正数;为1,则为负数
M表示有效数字的,大于1,小于2 (用二进制表示的)
2^E表示指数位。
内存中存储的就是S、E、M三个数据
(对应32位float类型)
[bit0]1bit存储S,[bit1-bit8]8bit存储E,[bit9-bit31]23bit存储M。
(对应64位double类型)
[bit0]1bit存储S,[bit1-bit11]11bit存储E,[bit9-bit63]52bit存储M。
  • 注意:计算机内部保存M时,默认这个数的第一位总是1,所以可以省略,只保存小数点后的位数。

    • 例如:1.25 换成二进制是 1.01 ,M位只保存 01 。
  • 注意:存储E时,要在原数值上加上127(float)或者1023(double)进行修正。
float f = 5.5;
    //二进制形式    :101.1
    //换成国际标准    :(-1)^0 * 1.011 * 2^2
    //S=0;
    // E=2;    需要加127修正 所以 E = 129
    // M=1.011      相当于存储1.01100000000000000000000,小数点后面补0
    //内存中存储:0 10000001 01100000000000000000000

取浮点数时

  • 当E全为0时,取浮点数的指数E时,E = 1-127(或者1-1023)

    • 并且M的值,不再加上整数位的 1,而是还原为 0.xxxx 的小数。
  • 当E全为1时,如果有效数字M全为0,则表示正负无穷大(正负取决于符号位S)
  • 当E有0有1时,E = 计算值 - 127(或1023)

    • 并且将有效数字M的值加上整数位的 1,得到1.xxxx的小数。
int main()
{
    int n = 9;
    float* pfloat = (float*)&n;
    //源反补相同:0000 0000 0000 0000 0000 0000 0000 1001
    //以float方式读取:
    // bit0位为0            S=0
    // bit1-bit8位全为0        E=1-127=-126   (E全为0,M不再加上整数位的1)
    // bit9-bit31            M = 000 0000 0000 0000 0000 1001 == 0.000 0000 0000 0000 0000 1001  (注意M的值是用二进制直接计算的)
    // *pfloat = (-1)^0 * 0.000 0000 0000 0000 0000 1001 * 2^(-126)
    printf("n的值为:%d\n", n);
    printf("*pfloat的值为:%f\n", *pfloat);

    *pfloat = 9.0;
    printf("n的值为:%d\n", n);
    printf("*pfloat的值为:%f\n", *pfloat);
    return 0;
}=

全局变量和局部变量的初始化问题

  • 全局变量未初始化时,默认值为0。
  • 局部变量未初始化时,程序会报错。

夜枫微凉
27 声望4 粉丝

« 上一篇
数组与指针一
下一篇 »
栈的使用习惯