6

8進数のprintf機能を理解しようとしています。コードを次のように記述した場合:

int main()
{
  char *s = "\123";
  printf("%s",s);
}

SのASCIIは8進数で123であるため、実際には正しいSとして出力されます。しかし、私の質問は、コンパイラが8進数から変換する数列をどのように識別するかということです。例えば:

char *s = "\123456" 

S456として出力します

8進数変換には最大3つの数値が必要ですか?

8進数を指定できる最大制限はありますか(最大3桁の8進数は777になります)

最大255個のASCII文字(8進数の377)があるため、777を印刷しようとすると、典型的なASCII文字が出力されます。これは、この番号にASCII文字が割り当てられていないためと考えられます。また、この機能はコンパイラ/ OSに依存していますか?

ここでの最初の質問以来、かなり明確になっていることを願っています:-)

4

3 に答える 3

9
  1. はい。8進文字リテラルの最大値は3桁です。仕様から6.4.4.4文字定数

    8進数のエスケープシーケンス:8進数の8進数の8進数の8進数の8進数の8進数の8進数の8進数の8進数
    \
    \
    \

    16進数のエスケープシーケンス:16進数の16進数のエスケープシーケンス16進数の数字
    \x

  2. 最大の8進数のエスケープシーケンスは\777、おっしゃるようです。上記の仕様の引用からわかるように、16進数のエスケープシーケンスに上限はありません。

  3. ASCII文字は128文字(0-127)のみです。つまり、ASCIIには8進数\000を使用できます。\177別の文字セットを使用する場合\377は、8ビット文字で移動でき、。まで\777(または16進エスケープシーケンスを使用してそれ以上)移動できる場合がありwchar_tます。仕様によると:

    8進数または16進数のエスケープシーケンスの値はunsigned char、整数文字定数の型、またはwchar_tワイド文字定数に対応する符号なし型の表現可能な値の範囲内でなければなりません。

    ほとんどのマシンでunsigned charは、は8ビットタイプであり、8進数のエスケープシーケンスを\377そのコンテキストに制限し、16進数のシーケンスをに制限します\xff。32ビットwchar_tコンテキストの場合、16進シーケンスは。まで高くなる可能性があります\xffffffff

于 2013-02-11T06:36:46.997 に答える
3

C99標準(私が見ることができるもの)はoctal-escape-sequence、文字列を次のように定義しています。

octal-escape-sequence:
    \ octal-digit
    \ octal-digit octal-digit
    \ octal-digit octal-digit octal-digit

したがって、いずれもoctal-escape-sequence最大3桁の8進数(07)を持ちます。

説明は単に次のように述べています。

8進エスケープシーケンスのバックスラッシュに続く8進数字は、整数文字定数の場合は1文字、ワイド文字定数の場合は1つのワイド文字の構成の一部と見なされます。このように形成された8進整数の数値は、目的の文字またはワイド文字の値を指定します。

また、

各8進数または16進数のエスケープシーケンスは、エスケープシーケンスを構成できる文字の最長シーケンスです。

そして、次の制約:

8進数または16進数のエスケープシーケンスの値は、整数文字定数の場合はunsigned char型、ワイド文字定数の場合はwchar_tに対応するunsigned型の表現可能な値の範囲内でなければなりません。

したがって、最大8ビットが使用される場合( < )、の値は\777制約に違反します。CHAR_BIT9仕様でこれについて何かを見つけることができませんでした。これは未定義の動作であるため、コンパイラに依存していると思います。

于 2013-02-11T06:37:49.927 に答える
0

数値の前に「0」を付けると、コンパイラにとって8進数として識別されます。例:0123

数値の前に「0x」を付けると、コンパイラーにとって16進数として識別されます。例:0x123

それ以外の場合は10進数です。例:123

char * s = "\ 123456"

エスケープシーケンスの例では、\123は10進数です。文字の範囲は0〜255であるため、コンパイラは3桁のみを使用することを認識しています。したがって、3桁で上限が設定されます。

ところで、10進数の123の文字は「S」です。これが文字列が「S456」である理由です。

于 2013-02-11T06:36:25.623 に答える