| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5870 人关注过本帖
标题:十六进制的输出问题
只看楼主 加入收藏
yangsenu
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-8-25
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:8 
十六进制的输出问题
#include<stdio.h>
 main()
 {
 char x=0xFFFF;
 printf("%d\n\n\n",x--);
 }
程序运行结果为什么是-1.
搜索更多相关主题的帖子: 十六进制 输出 
2009-08-27 23:15
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:2 
x=0xFFFF
x值等于65535,大于32767就是有符号数,用%d输出就是有符号的-1,如用无符号%u输出,就是65535

努力—前进—变老—退休—入土
2009-08-27 23:31
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:2 
呵呵,先去好好看看书吧。
2009-08-28 01:58
baikil
Rank: 10Rank: 10Rank: 10
来 自:X星球
等 级:青峰侠
威 望:4
帖 子:282
专家分:1580
注 册:2009-7-20
收藏
得分:2 
数据类型范围没记住吧,越限可是不道德的!

自创QQ群64885635,方便C#学习交流.希望各项工作路好学都好入!
2009-08-28 10:25
new_hand
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2009-6-25
收藏
得分:2 
x=65536,计算机用二进制存储,即1111111111111111;
%d输出时 首位为1,存储的即为负数,负数按补码存放,依据“取反加一”原则,即0000000000000001
转化成十进制即  -1。
2009-08-29 20:47
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:2 
以下假定测试机器为32位。
                                                        .
对于char类型的变量x而言,你虽然给x赋值0xFFFF,但编译器会对其进行截断,因为char类型的长度只有1字节,所以内存中实际存在的是0xFF,而不是0xFFFF,也因此与65535和65536都没有任何关系。至于为什么会打印出"-1",是因为"%d"要求char类型的0xFF被进行的是"带符号扩展"(对应的汇编指令为movsx),也就是说0xFF被扩展成值为0xFFFFFFFF的临时变量进行输出,此时"%d"就输出为"-1"了。如果你把输出改为"%08X"就能很容易看到这一点。还有,你可以把char x = 0xFFFF改为 unsigned char 就可以很好的看到这一点(此时进行的是"无符号扩展",对应的汇编指令为movzx,0xFF会被扩展为0x000000FF进行输出)。注:这里没有考虑 x--中的"--"问题。
                                                                      .
以下是我的一些测试,环境为VC6 + Debug方式,编译时均会出现提示:"warning C4305: 'initializing' : truncation from 'const int ' to 'char '",这就说明编译器对其进行了截断。
                                                                       .
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char x=0xFFFF;
    printf("%08X\n\n\n", x--);
    return 0;
}
输出:
FFFFFFFF
                                                                       .
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char x=0xFFFF;
    printf("%u\n\n\n", x--);
    return 0;
}
输出:
4294967295
                                                                       .
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    unsigned char x=0xFFFF;
    printf("%d\n\n\n", x--);
    return 0;
}
输出:
255
                                                                       .
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    unsigned char x=0xFFFF;
    printf("%08X\n\n\n", x--);
    return 0;
}
输出:
000000FF
                                        .
为了更清楚的说明这一问题我们不妨进一步做如下测试:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int i = 0x33;
    char x = 0xFFFF;
    int j = 0x44;
    printf("%d\n\n\n", x--);
    return 0;
}
编译通过后,在printf函数那一行下断点,运行中断后查看内存,得:
0012FF74  44 00 00 00 FF CC CC CC  D....烫.
0012FF7C  33 00 00 00 C0 FF 12 00  3.......
0012FF84  39 12 40 00 01 00 00 00  9.@.....
我们可以看到0x44和0x33之间的并不是0xFFFF,而是0xFF。
说明:"FF"后面的3个"CC"是因为那3个字节是没有被用过的内存而内存又要按32位对齐所致。
=======================
晕了,发帖不支持段落之间的空行了?排版真难看,所以行与行之间加了个点"."。

[ 本帖最后由 prankmoon 于 2009-8-31 22:39 编辑 ]
2009-08-31 19:57
小汪
Rank: 2
等 级:论坛游民
帖 子:18
专家分:13
注 册:2009-8-31
收藏
得分:2 
支持楼上
2009-09-02 14:25
qingjunfa
Rank: 1
等 级:新手上路
帖 子:3
专家分:3
注 册:2008-8-31
收藏
得分:2 
同意6楼的意见
2009-09-02 18:01
蚂蚁不爬
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-18
收藏
得分:0 
6楼犀利
2011-09-18 09:15
快速回复:十六进制的输出问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011867 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved