注意符号数的打印显示

请看此段代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1#include < stdio.h >
 2#include <math.h>
 3main()
 4ExpandedBlockStart.gifContractedBlock.gif{
 5    double a;
 6    char * c;
 7    a = -10000000000;
 8    c = (char*)&a;
 9    printf("%2x %2x %2x %2x %2x %2x %2x %2x\n",*c,*(c+1),*(c+2),*(c+3),*(c+4),*(c+5),*(c+6),*(c+7));
10    printf("\n");
11}

 

   我的本意是:内存浮点数都是以IEEE754的形式存储的,现在将以IEEE754的形式来查看数据。因此,我先将浮点数据地址取出来,并转换成字符形的,然后就从最后一个地址(第7个),逐渐向前取数据,里面的数据就是IEEE754存储的数据。

    但是,结果却多出来一些f,比如上面运行的结果为:0 0 0 20 5f ffffffa0  2 ffffffc2。而-10000000000IEEE754的表示为:C2 02 A0 5F 20 00 00 00,那么那些意外的f是怎么出来的呢?

    我观察到出现f的地方都是字节的最高位为1的地方,那么就是说这是与符号相关的,因此,对于符号位最高为1的,都当成了负数来处理,而负数在x%的显示中都是以32位的形式显示的,因此,在使用必须要小心符号。对于以上程序作如下略微的改变的,就可以得到想要的结果:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
1main()
2ExpandedBlockStart.gifContractedBlock.gif{
3    double a;
4    unsigned char * c;
5    a = -10000000000;
6    c = (unsigned char*)&a;
7    printf("%2x %2x %2x %2x %2x %2x %2x %2x\n",*c,*(c+1),*(c+2),*(c+3),*(c+4),*(c+5),*(c+6),*(c+7));
8    printf("\n");
9}

 

显示结果为: 0 0 0 20 5f a0  2 c2

 

转载于:https://www.cnblogs.com/bingsuixing/archive/2008/12/13/1354487.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值