2014-10-30 68 views
-1

我一直在看Zed A. Shaw的“Learn C hard way”教程。他的一个额外信贷问题(练习9)要求我代表char[4]作为int%用于表示整数的X格式说明符

跑遍了全后,我来到了一个SO问题,这是同样的事情,因此设法想出答案:

int i; 
int intName = 0; 

for(i = 0; i < 4; i++){ 
    intName = intName + name[i]; 
} 

printf("intName: %d\n", intName); 
printf("intName: %X\n", intName); 

输出:

intName: 291 
intName: 123 

手头的名字是“Zed”,我计算了ASCII十进制值,他们确实加起来为291,这很好。然而,在搜索后,我找不到任何解释,为什么%X将返回123.

在这种情况下,此格式说明符是做什么的?如果我想得到一些关于发生什么的详细答案,那将是非常棒的。学习C似乎更深入,我觉得我应该完全理解这些基本知识,然后再转向其他任何东西。

+1

我不认为你的解决方案是该问题的作者想到的。您只需添加字符的序数值,例如'“Zed”'和'“edZ”'会产生相同的结果,就像其他许多不同字符的组合一样。我认为你需要更仔细地阅读练习。 (我假设这个问题本身是相当明确的,但我没有检查。) – 2014-10-30 18:11:55

+0

当以十六进制打印一个数字时,最好在它前面加上'0x'或'0X'来清楚阅读器(假设读者对C语法有所了解):'printf(“intName:0x%X \ n”,intName);' – 2014-10-30 18:13:02

+0

@KeithThompson - 我明白你的意思,可能是这样的情况,Extra Credits部分相当含糊,主要是帮助你探索你通常不会探索的东西。如果你希望看看Zed A. Shaw的教程练习9以更好地了解他所要求的内容。至于你的第二个评论,你是对的,最好用一个0x表示十六进制。谢谢! – Juxhin 2014-10-30 18:16:44

回答

1

但是搜索后我找不到任何解释为什么%X将返回123

这只是印刷数量的十六进制表示。十六进制123 =十进制291.从printf man page(第一我偶然发现):

O,U,X,X
将unsigned int参数被转换为无符号八进制(○),无符号十进制(u)或无符号十六进制(x和X)表示法。字母abcdef用于x转换;字母ABCDEF用于X转换。精度(如果有的话)给出必须出现的最小位数;如果转换后的值需要较少的数字,则在左侧用零填充。默认精度为1.当0以显式精度0打印时,输出为空。

+0

感叹,必须是简单的事情..非常感谢乔恩! – Juxhin 2014-10-30 17:55:35