2012-07-13 166 views
0

一些我认为这应该工作。为什么printf自动将%x%o%d转换为十六进制十六进制和十二进制

#include<stdio.h> 
void main(void) 
{ 
    short i; 
    scanf("0x%hi",&i); 
    printf("0x%x\n",i); 
    printf("0%o\n",i); 
    printf("%d\n",i); 
} 

不知为什么?任何答案,为什么不工作。我认为这应该自动做到十六进制转换和至少它应该正确打印小数

32768 
    0x26 
    046 
    38 

是我得到的32768输入。

+0

'void main(void)'是错误的。使用'int main(void)'。如果您的教科书告诉您使用'void main(void)',请索取您的退款。参见[comp.lang.c FAQ](http://c-faq.com/),第11节,从问题11.12a开始。 (注意:说这是“错误”是一个轻微的过分简单化,但现在已经足够接近了。) – 2012-07-13 20:13:40

+0

你应该得到的是'32768 0x0 00 0'。所以我对你为什么得到你引用的结果感兴趣。你在使用什么平台和编译器? – 2012-07-13 20:14:58

+0

使用* short * over * int *几乎没有任何实际益处。除非有缩短整数的可证明的好处,否则请避免。比特很便宜,错误是昂贵的。 – jforberg 2012-07-13 20:16:02

回答

4

short可能是您的平台上的16位,在这种情况下32768不适合。尝试使用更大的类型。

演示:http://ideone.com/D0hzP

+0

或者更小的值,比如'32767'。 – 2012-07-13 20:10:31

+0

只是为了澄清:如果您给scanf一个不适合的数字,它将使变量未定义,并且可能已经充满了垃圾。检查scanf和朋友的回报值总是值得的。 – 2012-07-13 20:20:26

0

对不起,我犯了一个愚蠢的错误。但是,当你提出一个问题时,它确实有助于并给予勇气和安慰。

 scanf("%hi",&i); 

删除0x修正了这个。感谢大家的帮助。

相关问题