当打印整数时,printf语句如何在这里工作?

#include int main() { int a=034; printf("%d",a); return 0; } 

如果我给出一个034的值,那么输出是28.如果它是028,它会给出一个错误,说“无效数字”8“八进制常量”。

C如果启动一个零( 0 )的整数,则将其视为数字的八进制表示。 在八进制表示中,只有8个有效数字。 它们分别为0,1,2,3,4,5,6和7。

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

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

PS:如果你用0x0X开始一个数字,那么它被视为数字的hex表示。

PS:如果要以八进制格式打印整数,则格式说明符为%o 。 例如: printf("num = %o \n", num);

PS:如果要以hex格式打印整数,则格式说明符为%x%X 。 例如: printf("num1 = %x, num2 = %X \n", num1, num2);

整数可以用十进制,八进制或hexforms表示。

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

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

因此,如果

 int a=028; 

给你 :

 error: invalid digit "8" in octal constant 

原因很明显,’8’不是有效的八进制’数字’。

printf()只会进行正常操作。 消息建议,以0开头但不是hex常量的整数常量是八进制常量。

034 = 3 * 8 + 4 = 28

当printf在执行时看到它时,数字是二进制的,如下所示:

 011100 (binary) 

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

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

当我们在整数变量中输入一个输入时,如下所示:

 int n = 34; 

它只是意味着我们在变量n中输入十进制数(基数为10)。 但是当我们在数字前面增加一个零时,例如:

 int n = 034; 

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

在类似的说明中,我们还可以将hex值提供给普通的整数变量,如:

 int n = 0x34; 

在这里,编译器将简单地将hex值0x34((3 * 16)+ 4 = 52)的二进制等效值放在变量中。 注意。 在“0x”中,第一个字符为零0,而不是字符“o”或“O”

一个例子将总结:

 #include 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 */ 

希望这能解释一切……

引自N1570,6.4.4.1整数常量 :(< - 有关详细信息,请参阅此链接。)

 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不是合法的”八进制数字“,因此编译器会给出错误。

这里的问题是C语言识别用0表示的数字作为整数数据类型中的八进制数字。因此,如果要在开头打印零,请不要在整数的开头使用零。 试试这个代码。 它在开始时给出零。

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

你必须使用sprintf,它给出了格式化的输出。这里的ds表示指向char数组的指针.int变量的值存储在char数组中。

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

前面的数字不能为零! 如果需要打印03400345007等前导零,则需要将这些零作为字符打印。

 printf("00%i", 7); 

当一个数字以C / C ++ / JavaScript和其他一些语言中的零开头时,它只是意味着一些特殊的很少使用的数字类型,称为Octal。