C で次の文字定数を記述したとします。
'\xFFFFAA'
その数値は?
標準C99は次のように述べています。
- 文字定数の型は
int
です。 - 16 進文字定数は、 として表すことができます
unsigned char
。 - 基本文字定数の値は負ではありません。
- 文字定数の値は の範囲に収まります
char
。
その上:
- の値の範囲は の値の
signed char
範囲に含まれていますint
。 - 、 、 のサイズ (ビット単位) は同じで
char
、1 バイトです。unsigned char
signed char
- バイトのサイズは で与えられ
CHAR_BIT
、その値は少なくとも 8 です。
の典型的な状況があるとしましょうCHAR_BIT == 8
。
また、それが私たちのためだとchar
しましょsigned char
う。
規則に従う: 定数 '\xFFFFAA' の型int
は ですが、その値はで表すことができますがunsigned char
、実際の値は に収まりますchar
。
これらの規則から、'\xFF' の例は次のようになります。
(int)(char)(unsigned char)'\xFF' == -1
最初のキャストunsigned char
は、「unsigned char として表現できる」という要件から来ています。
2 番目のキャストchar
は、「値が 1 文字に収まる」という要件から来ています。
3 番目のキャストint
は、「int 型を持つ」という要件から来ています。
ただし、定数'\xFFFFAA'
が大きすぎて、 として「表現」できませんunsigned int
。
その価値はどれですか?
(char)(0xFFFFAA % 256)
この値は、標準が多かれ少なかれ次のように述べているため、次の結果であると思います。
- 符号なし整数型の場合、値がその型で表現できる最大Mよりも大きい場合、値はMを法とする剰余を取った後に取得されます。
私はこの結論で正しいですか?
編集私は@KeithThompsonによって確信しました:彼は、標準によれば、大きな16進文字定数は制約違反であると言います。
だから、私はその答えを受け入れます。
ただし、たとえば、GCC 4.8、MinGW では、コンパイラは警告メッセージをトリガーし、プログラムは説明した動作に従ってコンパイルされます。したがって、'\x100020' のような有効な定数と見なされ、その値は 0x20 でした。