#include<stdio.h>
int main()
{
int a=034;
printf("%d",a);
return 0;
}
如果我给出一个值为034,则输出为28. 如果它是028,它会给出一个错误,说“八进制常量”中的“无效数字”8“。打印整数时,printf语句在这里如何工作?
#include<stdio.h>
int main()
{
int a=034;
printf("%d",a);
return 0;
}
如果我给出一个值为034,则输出为28. 如果它是028,它会给出一个错误,说“八进制常量”中的“无效数字”8“。打印整数时,printf语句在这里如何工作?
printf()
只会进行正常操作。根据消息的建议,以0开头而非十六进制常量的整数常量是八进制常量。
034 = 3 * 8 + 4 = 28
而受的printf看到它在执行时的时间,数量为二进制,看起来像这样:
011100 (binary)
也就是说,十六加八加四或28(十进制)
这里的问题是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值被存储在字符数组。
不是一般的数字,只是整数常量。 '0.125'是用十进制表示的有效数字。另外,'0'是一个有效的整数常量,具有显而易见的值,所以“你不能在整数的开头使用零”(是的,'0'是一个八进制常数)。实际上,这种说法通常不是真实的。你当然可以*在整数常量的开头使用'0';它只是导致它被解释为八进制。 –
是的。我同意你 –
在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:如果你用0x
或0X
开始一个数字,那么这被视为数字的十六进制表示。
P.S:如果要打印八进制格式的整数,格式说明符是%o
。例如:printf("num = %o \n", num);
P.S:如果要打印十六进制格式的整数,格式说明符%x
或%X
。例如:printf("num1 = %x, num2 = %X \n", num1, num2);
整数可以用十进制,八进制或十六进制形式表示。
例如,32,040和0x20是具有相同值的十进制,八进制和十六进制表示。
所以,如果
int a=028;
为您提供:
error: invalid digit "8" in octal constant
原因是显而易见的, '8' 是不是一个有效的八进制 '数字'。
我相信小写'a-f'也可以用 –
@EdHeal:更新,谢谢.. – sjsam
它不是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
*/
希望这说明了一切..
int a = 34;
printf("0%i\n", a);
号码前面不能有零!如果您需要打印这样的前导零如034
或00345
或007
,则需要将这些零打印为字符。
printf("00%i", 7);
当数与C/C++/JavaScript和其他一些语言零开始的,它只是意味着一些特殊的很少使用的类型号,被称为八。
'数字不能在前面有零!'有点误导。而且,八进制数很少见?也是“很少使用的数字类型”,在这里没有多大意义。你的意思是'很少使用数字基地'吗?不是我downvote,但我相信这可能是我提到的原因 – sjsam
这个答案是不完整的。它应该说“十进制整数在前面不能有零...”... – user3078414
引自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是不合法的‘八进制数字’,所以编译器给你一个错误。
的printf()行为不好 - 格式字符串末尾应该有一个换行符,打印的值由所用的八进制符号控制;前导零表示“八进制”(或基数为8),只有数字0 .. 7.'034'是3 * 8 + 4 = 28 base 10(就像28 = 2 * 10 + 8 = 28);'038'是无效的,因为'8'在范围0..7之外,这是完全相切的使用'printf()'注意,如果你愿意,可以用'%o'来打印结果为八进制,'%X'以十六进制打印 –
错误信息是一个很大的提示; - ) –
尝试a = 34而不是a = 034 –