C类型转换有关问题
C类型转换问题float c 7.0short d *(short *)&c如上所示代码,在32位系统上,float占4 bytes short占2
C类型转换问题
float c = 7.0; short d = *(short *)&c;如上所示代码,在32位系统上,float占4 bytes short占2 bytes
转换后d为0对么? C
[解决办法] 引用: Quote: 引用: 如果short是2个字节,那么你是对的。 //7.0 00 00 e0 40 内存里面看到的7.0的二进制串为 0100 0000 1110 0000 0000 0000 0000 0000 这儿不太明白了。高地址 ---------------------- 低地址
0100 0000 1110 0000 0000 0000 0000 0000
从地地址开始读: 00 00 f0 04(16进制)
[解决办法] 两种转换的对比
其一:
float c = 7.0;
short d = (short)c;
属于强制转化,大类型到小类型的转换。结果为7
其二:
float c = 7.0;
short d = *(short *)&c;
是对c取了地址,然后将这个地址强制按(short*)的方式来取值,那么这就涉及到指针了。
转换之后取值时,只会选择低位的两个字节。
我们知道浮点型在内存中是以指数方式存储的
1位符号位,8为指数位,23位小数位
且他们之间有个公式转换
如7.0 = 0b111(二进制),小数部分为0,那么如果用指数来表示1.11*2e2
分解后符号位为0,小数位为11后接21个0,对于指数位为,e=x-127,e=2,故x=129及0b10000001将所有的结合起来就是0 1000 0001 11....
即为上楼说的看到数据在内存中的存储情况
0100 0000 1110 0000 0000 0000 0000 0000
所以结果为0x00000e04
取两个低字节即为0
你可以尝试改为int 用%x输出的话就是上面这个答案了。