11

先行ゼロを含む整数を作成する場合、cはそれをどのように処理しますか?Cのバージョンによって違いますか?

私の場合、それらは削除されたように見えます(しかし、おそらくそれはprintfが行うことですか?):

#include <stdio.h>

int main() {
    int a = 005;
    printf("%i\n", a);
    return 0;
}

printfを使用して0を埋めることができることは知っていますが、これがどのように機能するのか疑問に思っています。

4

8 に答える 8

37

先行ゼロは、数値が8進数または8進数で表されていることを示します。したがって、010=8です。先行ゼロを追加しても効果はありません。数学で期待するのと同じように、x + 0 * 8 ^ n = x; 表現を長くしても値に変化はありません。

これをよく目にする場所の1つは、UNIXファイルモードです。0755は、実際には7 * 8 ^ 2 + 5 * 8 + 5=493を意味します。または、0022 = 2 * 8 + 2=10などのumaskを使用します。

atoi(nptr)strtol(nptr, (char **) NULL, 10)は、エラーを検出しないことを除いて、と同等として定義されます。そのため、atoi()常に10進数を使用します(したがって、先行ゼロは無視されます)。strtol(nptr, anything, 0)次のことを行います。

文字列は、任意の量の空白(によって決定されるisspace(3))で始まり、その後に単一のオプション'+'または'-'記号が続く場合があります。基数が0または16の場合、文字列に"0x"プレフィックスを含めることができ、数値は基数16で読み取られます。それ以外の場合、次の文字がである場合を除き、ゼロの基数は10(10進数)と見なされます。次の文字が'0'である場合は、8(8進数)と見なされます。

したがって、Cコンパイラと同じルールを使用します。

于 2009-11-02T13:34:18.690 に答える
8

気をつけて!

このステートメント005には、8進数の定数が含まれています。

int a = 005;

この場合、1桁の8進定数は、同等の10進定数と同じ値ですが、Cであるため、問題ではありません。015 != 15

整数リテラルが8進数、10進数、または16進数で表現されているかどうかに関係なく、コンパイラーによって解析されると、値として扱われます。整数がどのように出力されるprintfかは、そのタイプ、値、およびフォーマット指定子(およびアクティブなロケール)のみに依存します。

于 2009-11-02T13:35:17.877 に答える
8

先行ゼロが数値が8進数であることを示すという事実は、忘れられがちなことです。誰かがオクテットに適切な通常の形式を使用してIPアドレスを入力しようとしたときなど、混乱が何度か発生するのを見てきました。

192.168.010.073

パーサーは最後の2オクテットを8進数として解釈しました。

Cが不幸にも先行ゼロを使用して数値を8進数にするよりも悪いのは、Javascriptが先行ゼロを処理して数値を8進数にすることです(残りの桁がOKの場合は数値は8進数です。それ以外の場合は8未満です。10進数です)。Javascriptでは、(017 == 15)しかし(018 == 18)

むしろエラーが発生したいのですが。実際には、8進数のリテラルサポートを完全に削除したいと思います。少なくとも、多分、より顔の見えるプレフィックスを使用してください

0t10  (ocTal 8)
0k17  (oKtal 15)

しかし、私は私の提案に約35年遅れています。

于 2009-11-02T15:35:58.060 に答える
5

先行ゼロの付いた数字は、Cのすべてのバージョンで8進数のエンコードを意味します011 == 9 == 0x9

8進数は、8に基づく記数法です(10進数の場合は10、16進数の場合は16ではありません)。だから011 == 1*8 + 1, 013 == 1*8 + 3、など。

于 2009-11-02T13:35:49.677 に答える
3

試してみてください:

int a = 5;
printf("%03i\n", a);

0は「ゼロのあるパッド」を意味し、3は出力の望ましい長さです。

編集:申し訳ありませんが、私はあなたの質問をあまりにも早く読みました-今、あなたが完全に異なる何かについて質問したのを見ます。ただし、他の人に役立つ可能性があるため、これはそのままにしておきます。

于 2009-11-02T13:45:41.053 に答える
2

先頭に付い0た数字は、その数字が8進数であることを示します。これは整数リテラルと呼ばれます。2進数0b表すために使用することもできます。16進数の場合はまたはです。10進数の場合は何も書く必要はありません。以下のコードを参照してください。0x0X

#include<stdio.h>

int main()
{
    int binary = 0b10;
    int octal=010;
    int decimal = 10;
    int hexa = 0x10;
    printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}

詳細については、 tutorialspointをご覧ください。

于 2019-02-01T15:03:00.633 に答える
1

整数には「先行ゼロ」がありません。5は5であり、必要に応じて、printf修飾子があるため、先行0を使用して文字列表現を記述できます。

于 2009-11-02T13:33:59.813 に答える
1

あなたの特定のケースでは、ゼロはprintfによって削除されています。 コンパイラが整数を8進数として処理する最初のゼロを除いて、先行ゼロはすべてコンパイラによって削除されます。005の場合、8進数表現と10進数表現はどちらも同じであり、気にする必要はありませんが、特に8進数表現を意味しない限り、問題が発生します。

先行ゼロは、純粋に整数の文字列表現と関係があります。先行ゼロで印刷するには、「%03d」を使用します。これにより、フィールド長が3になります。

通常、「%<x> d」はx文字幅の整数を出力し、先頭にスペースを埋め込みます。"%0 <x> d"は同じことを行いますが、先行ゼロで埋めます。

于 2009-11-02T13:39:14.733 に答える