4

Cプログラミング言語に関するK&Rブックの第2章(定数という名前のサブセクション2.3)から:

特定の文字は、\n (改行) などのエスケープ シーケンスを使用して、文字定数および文字列定数で表すことができます。これらのシーケンスは 2 つの文字のように見えますが、1 つのみを表しています。さらに、任意のバイト サイズのビット パターンを次のように指定できます。

′\ooo′

ここで、ooo は 1 ~ 3 桁の 8 進数 (0...7) または

′\xhh′

ここで、hh は 1 つ以上の 16 進数 (0...9、a...f、A...F) です。だから私たちは書くかもしれません

#define VTAB ′\013′    /* ASCII vertical tab */
#define BELL ′\007′    /* ASCII bell character */

or, in hexadecimal,
#define VTAB ′\xb′     /* ASCII vertical tab */
#define BELL ′\x7′     /* ASCII bell character */

私を混乱させる部分は、次の文言です(私の強調): ooo は1 から 3桁の 8 進数 (0...7)です。8 進数が 3 桁の場合、必要なビット数は 9 (各桁に 3) になり、文字に必要なバイト長を超えます。確かに私はここで何かが欠けています。私が見逃しているのは何ですか?

4

3 に答える 3

4

\ooo(3 桁の 8 進数) では、0 から 111111111 (バイナリ) または 511 までの 9 ビット値を指定できます。これが許可されるかどうかは、charサイズによって異なります。

以下のような割り当ては、多くの環境で警告を生成します。これらの環境では char が 8 ビットであるためです。通常、許可される最大の 8 進シーケンスは です\377。ただし、acharは 8 ビットである必要はありません。OPの「9... 文字に必要なバイト長を超えています」は誤りです。

char *s = "\777";  //warning "Octal sequence out of range"
char c  = '\777';  //warning
int i   = '\777';  //warning

8 進 3 桁の定数は、 ASCII が使用される通常の環境'\141'と同じです。'a'ただし、別の文字セットで'a'は、異なる場合があります。したがって、01100001 の移植可能なビット パターン割り当てが必要な場合は、'\141'代わりに を 使用できます'a'。を割り当てることで同じことを達成でき'\x61'ます。コンテキストによっては、8 進数のパターンが好まれる場合があります。

C11 6.4.4.4.9 プレフィックスが使用されていない場合、「8 進数または 16 進数のエスケープ シーケンスの値は、対応する型の表現可能な値の範囲内でなければならない: unsigned char」

于 2013-08-09T18:31:45.570 に答える
0

私が覚えている限り、文字のコード番号の範囲は K&R では定義されていません。初期の頃は、通常は ASCII 範囲 0 ~ 127 でした。最近では 0 ~ 255 の 8 ビットの範囲であることが多いですが、それよりも広い可能性もあります。いずれにせよ、char データ型に対する実装定義の制限は、エスケープ表記に対する制限も意味します。

たとえば、範囲が 0 ~ 127 の場合、\177は最大許容 8 進エスケープです。

于 2013-08-09T17:45:59.350 に答える