当打印整数时,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
在这里工作正常。 034
是octal
数,十进制数为28
。 所以printf
打印的是int变量a
正确值,八进制为34
,相当于十进制的28
。
但是,错误 – 使用038
– 与printf
无关。 当您尝试使用类似038
的数字时会出现错误,因为您正在使用八进制表示 – 通过以0
开始数字 – 但您使用的是无效数字8
,这在octal
数系统中根本不存在。
PS:如果你用0x
或0X
开始一个数字,那么它被视为数字的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);
前面的数字不能为零! 如果需要打印034
或00345
或007
等前导零,则需要将这些零作为字符打印。
printf("00%i", 7);
当一个数字以C / C ++ / JavaScript和其他一些语言中的零开头时,它只是意味着一些特殊的很少使用的数字类型,称为Octal。