C で次の文字定数を記述したとします。
'\xFFFFAA'
その数値は?
標準C99は次のように述べています。
- 文字定数の型は
intです。 - 16 進文字定数は、 として表すことができます
unsigned char。 - 基本文字定数の値は負ではありません。
- 文字定数の値は の範囲に収まります
char。
その上:
- の値の範囲は の値の
signed char範囲に含まれていますint。 - 、 、 のサイズ (ビット単位) は同じで
char、1 バイトです。unsigned charsigned 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 でした。