C类型转换问题
float c = 7.0;
short d = *(short *)&c;
如上所示代码,在32位系统上,float占4 bytes short占2 bytes
转换后d为0对么? C
[解决办法]
高地址 ---------------------- 低地址
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输出的话就是上面这个答案了。