繁体   English   中英

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

[英]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在这里工作正常。 034octal数,十进制数为28 这样printf正在打印的正确值int变量a34八进制,这相当于28十进制。

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

PS:如果你启动一个带有0x0X的数字,那么它被视为数字的十六进制表示。

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

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

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

  • 没有前导零表示十进制数字(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'不是有效的八进制'数字'。

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);

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

printf("00%i", 7);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM