算法竞赛入门经典---浮点数整数在内存中的存储方式
参考文章:http://www.cnblogs.com/zxtp/p/4938742.html
1、数据的存储方式:大端模式和小端模式
大端模式:低地址位存储值的高位,高地址位存储值的低位 ,数据填写时,不要考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。
小端模式:低地址存储值的低位,高地址存储值的高位 ,低位值小放在内存地址小的地方,高位值放在内存地址大的地方。
2、浮点数在内存中的存储方式
(1)程序1
#includeint main() { printf("%.1f\n", 8/5); return 0; }
运行结果为
(2)程序2
#includeint main() { printf("%f\n",5); return 0; }
运行结果为
(2)程序2
#includeint main() { int a=5; float b=133.5f; return 0; }
解释:
测试代码:
#includeint main() { float num = 133.5f; int *p = (int *)# printf("0x%x\n", *p); return 0; }
运行结果:
3、整数在内存中的储存形式
整数在内存中是以补码的形式存放
(1)求正数补码
原码:最高位为符号位(0为正,1为负)。
反码:一个正数,它的反码和原码相同;一个负数,符号位为1,其他各位与原码相反。
正数补码:正数的原码、反码和补码都相同。
十进制的整数5,其二进制数为:0000 0000 0000 0000 0000 0000 0000 0101,其补码为0000 0000 0000 0000 0000 0000 0000 0101
(2)求负数补码
负数转化为二进制:求负整数绝对值的二进制数,然后对其求反,求反后再加1得到负整数的二进制。
求十进制数-201的二进制:
201(十进制)---->:0000 0000 0000 0000 0000 0000 1100 1001----->(求反)1111 1111 1111 1111 1111 1111 0011 0110------>(加1)1111 1111 1111 1111 1111 1111 0011 0111
-201(十进制)---->1111 1111 1111 1111 1111 1111 0011 0111(二进制)
负数的反码:其绝对值的所有位取反
负数的补码:它的反码加1
例子:求十进制的整数-5的补码
5的原码:0000 0000 0000 0000 0000 0000 0000 0101
反码:1111 1111 1111 1111 1111 1111 1111 1010
加1得到补码:1111 1111 1111 1111 1111 1111 1111 1011
-5的补码为:1111 1111 1111 1111 1111 1111 1111 1011
补码的十六进制为:FFFF FFFB