c语言-整型和浮点型数据在内存中的存储

c语言-整型和浮点型数据在内存中的存储,第1张

c语言-整型和浮点型数据在内存中的存储

整型在内存中的存储 原码、反码补码

符号数据没有符号位,有符号数据最高位为符号位 。

负数:

(1)原码:二进制形式。e.g.   -5原码1000 0101

(2)反码:原码符号位不变,其他位按位取反。1111 1010 

(3)补码:反码+1就得到了补码。 1111 1011

正数:

正数的原码、反码、补码相同。

大端和小端
  • 大端存储模式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中。

  • 小端存储模式:数据的地位保存在内存的低地址中,数据的高位保存在内存的高地址中。

 例题一:
#include
int main()
{
    char a = -128;
    printf("%un", a);
    return 0;
}

首先写出a的补码:1000 0000
%u为无符号整型,所以会发生整型提升,补符号位。 所以a的补码为:11111111 11111111 11111111 10000000,按无符号数打印结果为:

运行结果:4294967168

 例题二:
#include
int main()
{
    char a = -1;                          
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%dnb=%dnc=%dn", a, b, c);
    return 0;
}

 

运行结果:a=-1,b=-1,c=255

浮点数在内存中的存储 

1.根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数可以表示为下面的形式:

(-1)^S*M*2^E

a.(-1)^S表示符号位,当S=0时,表示正数,当S=1时,表示负数。

b.M表示有效数字,大于等于1,小于2。

c.2^E表示指数位。

例如:5.5写成二进制为101.1,相当于1.011*2^2,那么,S=0,M=1.011,E=2。

2.IEEE 745规定:对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

                                                                   

 

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

                                                                       

 

3.IEEE 754对有效数字M和指数E,还有一些特别规定。

有效数字M:1

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存小数部分。比如保存1.011时,只保存011,后面的位数补0就可以了,等到读取的时候,再把第一位的1补上去。

指数E:

首先,E为一个无符号整数(unsigned int)

如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法是可以出现负数的,所以IEEE 754规定,存入内存的E是真实值加上一个中间数,对于8位的E,中间数是127,对于11位的E,中间数是1023。比如,2^2的E是2,所以保存为32位浮点数时,必须保存为2+127=129,即10000001。

然后,指数E还可以被分为三种情况:

E不全为0或不全为1

这个就是正常情况,取出内存中的数时,指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

E全为0

这时,浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxx的小数。这样做是为了表示正负零,以及接近于0的很小的数字。

E全为1

这时,有效数字M全为0,表示正负无穷大。
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4751868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-08
下一篇 2022-11-08

发表评论

登录后才能评论

评论列表(0条)

保存