printf问题

mondaine 2011-09-18 01:19:08
一段程序如下,vs 2008下编译输出结果是:
9 12345600000010
不理解,哪位高人给我解释下?


#include <stdio.h>
int main()
{
int a=0x09;
int b=0x10;
unsigned long long c=0x123456;
printf("%x %llx\n",a,b,c);
return 0;
}
...全文
240 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-19
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
ycwycf1 2011-09-19
  • 打赏
  • 举报
回复
受教了
qingfeng029 2011-09-19
  • 打赏
  • 举报
回复
受教了
mondaine 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 icesai 的回复:]

unsigned long long c=0x123456;
额 楼主能不能解释下这条语句是啥意思啊 、
[/Quote]

声明一个变量c,它的类型是unsigned long long int,值用十六进制表示是0x123456
int是内置数据类型,unsigned和long是修饰符。在用short或long修饰int时,int可以不写出来。
unsigned表示不记录正负信息,那么就多出记录正负的那一个bit,所以能够记录的最大正数就大了一倍。

limits.h这个头文件(Linux下位置是/usr/include/limits.h)里定义了每种数据类型的最大值和最小值,比如:

/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */
# define ULLONG_MAX 18446744073709551615ULL

头文件没有说一种类型得有多少个bit,只是要求这种类型能保证存储定义范围内的数据。

icesai 2011-09-19
  • 打赏
  • 举报
回复
unsigned long long c=0x123456;
额 楼主能不能解释下这条语句是啥意思啊 、
icesai 2011-09-19
  • 打赏
  • 举报
回复
额 受教了、、
mondaine 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ostnm 的回复:]

mark 这不是昨天的趋势笔试题么
[/Quote]

哈哈 正解!当时不理解
zhd320 2011-09-19
  • 打赏
  • 举报
回复
mark
OSTnm 2011-09-19
  • 打赏
  • 举报
回复
mark 这不是昨天的趋势笔试题么
mondaine 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 blueapples0604 的回复:]

引用 10 楼 mondaine 的回复:
呵呵,楼下几位都没理解我的意思。ll是小写的'LL',不是数字'11',



引用 1 楼 blueapples0604 的回复:

X前面加了ll,只是加长了其打印长度吧,恰巧c的内存地址在b前面,于是就把c也打印出来了

我写的也是L不是1,LL就是long long,也就是我说的加长了打印长度,导致把C打印出来了
[/Quote]

不好意思 我误解你的意思了
不过具体来说,就这道题目而言,加长了打印长度后,打印的并不是c全部,而是c的低位4字节;
c的低位4字节和b的4个字节组成了打印%ll 需要的八个字节,所以打印的结果是:
((c&0xffffffff)<<32)+b ,也就是12345600000010
若将c换成0x1234567812345601,那么相应的结果就是1234560100000010

不过,这种行为是未定义的,只不过在大多数系统上行为是这样。
blueapples0604 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mondaine 的回复:]
呵呵,楼下几位都没理解我的意思。ll是小写的'LL',不是数字'11',



引用 1 楼 blueapples0604 的回复:

X前面加了ll,只是加长了其打印长度吧,恰巧c的内存地址在b前面,于是就把c也打印出来了
[/Quote]
我写的也是L不是1,LL就是long long,也就是我说的加长了打印长度,导致把C打印出来了
mondaine 2011-09-18
  • 打赏
  • 举报
回复
楼上几位可以看下这个链接,有我希望得到的回复:

http://stackoverflow.com/questions/7460614/problem-with-function-printf
mondaine 2011-09-18
  • 打赏
  • 举报
回复
是小写字母'll'
我到stackoverflow上问了下,得到了想要的答案,可以看下:

http://stackoverflow.com/questions/7460614/problem-with-function-printf

[Quote=引用 4 楼 wyhllk 的回复:]

因为c语言实参求值的顺序是从右到左的
比如
k=1;
printf("%d,%d\n",k,k++);
运行的结果是2,1
而你的程序正好%11x,则先输出c,而且c的长度是11位的,没有就补0,在输出b,正好就是上面的结果
[/Quote]
mondaine 2011-09-18
  • 打赏
  • 举报
回复
呵呵,楼下几位都没理解我的意思。ll是小写的'LL',不是数字'11',


[Quote=引用 1 楼 blueapples0604 的回复:]

X前面加了ll,只是加长了其打印长度吧,恰巧c的内存地址在b前面,于是就把c也打印出来了
[/Quote]
BCabbage 2011-09-18
  • 打赏
  • 举报
回复
麻烦二楼再说清楚点
dzry24 2011-09-18
  • 打赏
  • 举报
回复
同意二楼,
xiaoyuer5222 2011-09-18
  • 打赏
  • 举报
回复
BCabbage 2011-09-18
  • 打赏
  • 举报
回复
VC 6下是 9 10
xunxun 2011-09-18
  • 打赏
  • 举报
回复
你想听什么样的解释
小类人猿 2011-09-18
  • 打赏
  • 举报
回复
因为c语言实参求值的顺序是从右到左的
比如
k=1;
printf("%d,%d\n",k,k++);
运行的结果是2,1
而你的程序正好%11x,则先输出c,而且c的长度是11位的,没有就补0,在输出b,正好就是上面的结果
加载更多回复(3)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧