无符号数据没有符号位,有符号数据最高位为符号位 。
负数:
(1)原码:二进制形式。e.g. -5原码1000 0101
(2)反码:原码符号位不变,其他位按位取反。1111 1010
(3)补码:反码+1就得到了补码。 1111 1011
正数:正数的原码、反码、补码相同。
大端和小端-
大端存储模式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中。
-
小端存储模式:数据的地位保存在内存的低地址中,数据的高位保存在内存的高地址中。
#includeint main() { char a = -128; printf("%un", a); return 0; }
首先写出a的补码:1000 0000
%u为无符号整型,所以会发生整型提升,补符号位。 所以a的补码为:11111111 11111111 11111111 10000000,按无符号数打印结果为:
例题二:运行结果:4294967168
#includeint 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,表示正负无穷大。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)