关于c:C语言中数据的存储

39次阅读

共计 1931 个字符,预计需要花费 5 分钟才能阅读完成。

整数在内存的存储形式

  • 符号位用 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。
  • 局部变量未初始化时,程序会报错。

正文完
 0