首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C类型转换有关问题

2013-07-08 
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输出的话就是上面这个答案了。

热点排行