C は先頭にゼロがある整数リテラルをどのように処理しますか? atoi はどうですか?

StackOverflow https://stackoverflow.com/questions/1661369

  •  12-09-2019
  •  | 
  •  

質問

先頭にゼロが付いた整数を作成する場合、c はそれをどのように処理しますか?C のバージョンが異なると異なるのでしょうか?

私の場合、それらは単にドロップされたように見えます(しかし、おそらくそれが printf の動作なのでしょうか?)。

#include <stdio.h>

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

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

役に立ちましたか?

解決

先頭のゼロは、数値が次の形式で表現されることを示します。 8進数, 、または基数 8。したがって、010 = 8となります。先頭にゼロを追加しても効果はありません。数学で予想されるように、x + 0*8^n = x;表現を長くしても値は変わりません。

この問題がよく見られるのは、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))単一のオプションが続きます '+' または '-' サイン。ベースがゼロまたは16の場合、文字列には "0x" プレフィックス、および数値はベース16で読み取られます。それ以外の場合は、次の文字がない限り、ゼロベースは10(小数)と見なされます '0', 、その場合、それは8(octal)とみなされます。

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

他のヒント

は注意してください!

このステートメント005では8進定数である。

int a = 005;
015 != 15

:単一の桁の8進定数が同等進定数とが、Cで同じ値を持っているので、

この場合は、問題ではありません それは、コンパイラによって解析されると、

整数リテラルは、進、10進数または16進数で表現されているかどうか、それがちょうど値として扱われます。どの整数printfを介して出力されることのみをその種類、その値とフォーマット指定(及びアクティブロケール)に依存します。

先頭にゼロが8進数であることを示しているという事実は、多くの場合、忘れて何かです。

:私は混乱原因な誰かが入力したオクテットのための素晴らしい、定期的なフォーマットを使用してIPアドレスをしようとしたときのように数回、それを見てきました
192.168.010.073

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

数オクタルを作るための先行ゼロのCの不幸な使用よりも悪い唯一のことは、の時々にゼロをリードするのJavascriptの処理です。の(数字の残りがある場合は8進数で数オクタルを作りますOK - それ以外の場合は10進数) - 8未満。 JavaScriptでは、(017 == 15)けど(018 == 18)

私はむしろエラーがあると思います。実際に私はむしろ完全進リテラルのサポートをドロップすると思います。多分

のように、少なくとも、より詳細なあなたの顔の接頭辞を使用します
0t10  (ocTal 8)
0k17  (oKtal 15)

しかし、私は私の提案で約35年遅すぎたんだ。

先行ゼロを持つ数はC.だからの011 == 9 == 0x9のすべてのバージョンで進符号化を意味する。

オクタル8(代わりに10進数または16進数の16は10)に基づいて番号付けシステムです。だから、011 == 1*8 + 1, 013 == 1*8 + 3、など。

あなたは試してみてください。

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

0手段 "ゼロでパッド"、3出力の所望の長さである。

編集を申し訳ありませんが、私はあまりにも早くあなたの質問を読んだ - 今、私はあなたが完全に異なる何かについて尋ねてきました参照してください。であるとして、それは他の誰かのために役に立つかもしれませんしかし、私は、これを残しておきます。

主要0との数が数がの数であることが示されます。それは、を整数リテラルのと呼ばれています。また、それが0bまたは0xであるの進数のため、の進数を表すため0Xを使用することができます。あなたは、の小数点以下のための任意のものを記述する必要はありません。コード怒鳴るを参照してください。

#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するます。

整数「は先行ゼロ」を持っていない5は、あなたがしたい場合は、そのためにあなたはprintfの修飾子を持って、0をリードすると、その文字列表現を書き込むことができ、5です。

<ストライキ>あなたの特定のケースでは、ゼロはprintf関数によってドロップされている。 すべての先行ゼロは8進数として整数を治療するためのコンパイラを起こし初期ゼロ以外のコンパイラによって削除されます。 005の場合は、進小数の表現の両方が同じであり、あなたを気にしないはずですが、あなたが特に進表現を意味しない限り、まだ、それがトラブルを求めています。

先頭のゼロは、整数の文字列表現を純粋にしなければなりません。先行ゼロを印刷するには、「%03D」を使用します。これは、3のフィールドの長さを確保します。

一般的に、「% D」広い整数xの文字を印刷し、先頭のスペースと意志パッド。 「%0 D」の先行ゼロと同じことが、意志パッドを行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top