[英]How does printf statement work here, when printing integer number?
#include<stdio.h>
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
的数字,那么它被视为数字的十六进制表示。
PS:如果要以八进制格式打印整数,则格式说明符为%o
。 例如: printf("num = %o \\n", num);
PS:如果要以十六进制格式打印整数,则格式说明符为%x
或%X
。 例如: printf("num1 = %x, num2 = %X \\n", num1, num2);
整数可以用十进制,八进制或十六进制形式表示。
例如,32,040和0x20是相同值的十进制,八进制和十六进制表示。
因此,如果
int a=028;
给你 :
error: invalid digit "8" in octal constant
原因很明显,'8'不是有效的八进制'数字'。
printf()
只会进行正常操作。 消息表明,以0开头但不是十六进制常量的整数常量是八进制常量。
034 = 3 * 8 + 4 = 28
当printf在执行时看到它时,数字是二进制的,如下所示:
011100 (binary)
也就是说,十六加八加四或28(十进制)
它不是printf函数,这里关注的是整数值,更准确地说,是基数8的整数值,即八进制数。
当我们输入整数变量的输入时,如下所示:
int n = 34;
它只是意味着我们在变量n中输入十进制数(基数为10)。 但是当我们在数字前面增加一个零时,例如:
int n = 034;
编译器将其解释为好像我们希望将变量n中的基数8,八进制数的值。 因此,它不是输入普通的十进制数34,而是将输入常量视为八进制((3 * 8)+ 4 = 28),并将相应的二进制值放入n中。
在类似的注释中,我们还可以将十六进制值提供给普通的整数变量,如:
int n = 0x34;
在这里,编译器将简单地将十六进制值0x34((3 * 16)+ 4 = 52)的二进制等效值放在变量中。 注意。 在“0x”中,第一个字符为零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
*/
希望这能解释一切......
引自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<stdio.h>
int main()
{
int a=34;
char ds[80];
sprintf(ds,"%03d",a);
puts(ds);
return 0;
}
你必须使用sprintf,它给出了格式化的输出。这里的ds表示指向char数组的指针.nob变量的值存储在char数组中。
int a = 34;
printf("0%i\n", a);
前面的数字不能为零! 如果需要打印034
或00345
或007
等前导零,则需要将这些零作为字符打印。
printf("00%i", 7);
当一个数字以C / C ++ / JavaScript和其他一些语言中的零开头时,它只是意味着一些特殊的很少使用的数字类型,称为Octal。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.