2016-07-10 25 views
5
#include<stdio.h> 
int main() 
{ 
    int a=034; 
    printf("%d",a); 
    return 0; 
} 

如果我给出一个值为034,则输出为28. 如果它是028,它会给出一个错误,说“八进制常量”中的“无效数字”8“。打印整数时,printf语句在这里如何工作?

+3

的printf()行为不好 - 格式字符串末尾应该有一个换行符,打印的值由所用的八进制符号控制;前导零表示“八进制”(或基数为8),只有数字0 .. 7.'034'是3 * 8 + 4 = 28 base 10(就像28 = 2 * 10 + 8 = 28);'038'是无效的,因为'8'在范围0..7之外,这是完全相切的使用'printf()'注意,如果你愿意,可以用'%o'来打印结果为八进制,'%X'以十六进制打印 –

+0

错误信息是一个很大的提示; - ) –

+1

尝试a = 34而不是a = 034 –

回答

6

printf()只会进行正常操作。根据消息的建议,以0开头而非十六进制常量的整数常量是八进制常量。

034 = 3 * 8 + 4 = 28

而受的printf看到它在执行时的时间,数量为二进制,看起来像这样:

011100 (binary) 

也就是说,十六加八加四或28(十进制)

1

这里的问题是C语言标识数字写入的0作为整数数据类型中的八进制数字。所以如果你想在开始时打印零点不要使用零点在整数的开始处。试试这个代码。它在开始时给零。

#include<stdio.h> 
int main() 
{ 
    int a=34; 
    char ds[80]; 
    sprintf(ds,"%03d",a); 
    puts(ds); 
    return 0; 
} 

必须使用这给格式化outputs.Here DS sprintf的装置指向int变量的炭array.Here值被存储在字符数组。

+1

不是一般的数字,只是整数常量。 '0.125'是用十进制表示的有效数字。另外,'0'是一个有效的整数常量,具有显而易见的值,所以“你不能在整数的开头使用零”(是的,'0'是一个八进制常数)。实际上,这种说法通常不是真实的。你当然可以*在整数常量的开头使用'0';它只是导致它被解释为八进制。 –

+0

是的。我同意你 –

14

C如果你开始一个零的整数(0),那么它被视为数字的八进制表示。在八进制表示中,只有8位有效数字。他们是0,1,2,3,4,5,6和7.

所以你可以看到printf在这里工作正常。 034是一个octal号码,它是十进制的28。因此printf正在打印int变量a的正确值,它是八进制的34,相当于28十进制。

但是,错误 - 使用038时 - 与printf无关。当您尝试使用像038这样的号码时会出错,因为您正在使用八进制表示法 - 通过以0开始号码 - 但您使用的是无效数字8,该号码在octal号码系统中根本不存在。

P.S:如果你用0x0X开始一个数字,那么这被视为数字的十六进制表示。

P.S:如果要打印八进制格式的整数,格式说明符是%o。例如:printf("num = %o \n", num);

P.S:如果要打印十六进制格式的整数,格式说明符%x%X。例如:printf("num1 = %x, num2 = %X \n", num1, num2);

9

整数可以用十进制,八进制或十六进制形式表示。

  • 没有前导零表示的十进制数(base10 => 0-9)
  • 前导0表示八进制数(base8 => 0-7)
  • 0x或0X表示是十六进制(base16 => 0-9,A/aF/f)

例如,32,040和0x20是具有相同值的十进制,八进制和十六进制表示。

所以,如果

int a=028; 

为您提供:

error: invalid digit "8" in octal constant 

原因是显而易见的, '8' 是不是一个有效的八进制 '数字'。

+1

我相信小写'a-f'也可以用 –

+0

@EdHeal:更新,谢谢.. – sjsam

2

它不是printf函数,这里关注的是整数值,更确切地说,是基数8的整数值,即八进制数。

当我们喂这样在整数变量的输入:

int n = 34; 

它只是意味着我们在一个十进制数投入变量n(基体10的)。但是,当我们在数字的前面把一个额外的零,如:

int n = 034; 

编译器将其解释为,如果我们希望把底座8,八进制数的值,在变量n。因此,它不是放入十进制数字34,而是将输入常量视为八进制((3 * 8)+4 = 28),并将相应的二进制值放在n中。

在类似的注释,我们也可以供给一个十六进制值转换为纯整数变量,如:

int n = 0x34; 

这里,编译器将简单地把十六进制值0x34的等效二进制数((3 * 16)+ 4 = 52)的变量。 注意。在 “0X”,第一个字符是0 0,不是字符 'O' 或 'O'

一个例子概括:

#include<stdio.h> 

int main(){ 
    int n; 

    //feeding in a Decimal Value 
    n = 34; 
    printf("\n\nDecimal value with\t%%d : %d", n); 

    //feeding in an Octal Value 
    n = 034; 
    printf("\n\nOctal Value with\t%%o : %o", n); 
    printf("\nOctal Value with\t%%d : %d", n); 

    //feeding in a Hexa-decimal Value 
    n = 0x34; 
    printf("\n\nHexadecimal Value with\t%%d : %d", n); 
    printf("\nHexadecimal Value with\t%%x : %x", n); 

    return 0;  
} 

/* 
Output: 
Decimal value with %d : 34 

Octal Value with %o : 34 
Octal Value with %d : 28 

Hexadecimal Value with %d : 52 
Hexadecimal Value with %x : 34 
*/ 

希望这说明了一切..

-3
int a = 34; 

printf("0%i\n", a); 

号码前面不能有零!如果您需要打印这样的前导零如03400345007,则需要将这些零打印为字符。

printf("00%i", 7); 

当数与C/C++/JavaScript和其他一些语言零开始的,它只是意味着一些特殊的很少使用的类型号,被称为八。

+2

'数字不能在前面有零!'有点误导。而且,八进制数很少见?也是“很少使用的数字类型”,在这里没有多大意义。你的意思是'很少使用数字基地'吗?不是我downvote,但我相信这可能是我提到的原因 – sjsam

+1

这个答案是不完整的。它应该说“十进制整数在前面不能有零...”... – user3078414

2

引自N1570, 6.4.4.1 Integer constants:(< - 请参阅此链接了解更多信息。 )

integer-constant: 
       ...... 
       octal-constant integer-suffixopt 
       ...... 
      ...... 
      octal-constant: 
       0 
       octal-constant octal-digit 
      octal-digit: one of 
       0 1 2 3 4 5 6 7 

如果我给一个值作为034时,输出为28

由于该前导零,034被认为是一个“八进制常数”由编译器,而十进制中的34是十进制的28。

如果它是028,它会给出一个错误,说明八进制 常量中的“无效数字”8“。

同样,前导零,使028的“八进制常数。然而,正如你可以在上面看到,8是不合法的‘八进制数字’,所以编译器给你一个错误。