仕事中にちょっと話題になった。
C 言語 FAQ
の質問 8.9
によると,文字定数は int 型。
であれば,'\x80' と 0x80 は同じ意味になるだろうということで,確かこんなテストコードを書いた。
(1) と (a) (d) が同じ結果になれば OK。
1 : #include <stdio.h>
2 :
3 : void test(char value)
4 : {
5 : printf("0x%02x :", (unsigned char)value);
6 : if ( '\x80' < value) printf(" (1)true "); else printf(" (1)false");
7 : if ( '\x80' <= value) printf(" (2)true "); else printf(" (2)false");
8 : if ( 0x80 < value) printf(" (a)true "); else printf(" (a)false");
9 : if ((char) 0x80 < value) printf(" (b)true "); else printf(" (b)false");
10: if ((unsigned char) 0x80 < value) printf(" (c)true "); else printf(" (c)false");
11: if ((int) 0x80 < value) printf(" (d)true "); else printf(" (d)false");
12: if ((unsigned int) 0x80 < value) printf(" (e)true "); else printf(" (e)false");
13: printf("\n");
14: }
15:
16: int main(int argc, char *argv[])
17: {
18: test('\x00');
19: test('\x7f');
20: test('\x80');
21: test('\x81');
22: test('\xff');
23: return 0;
24: }
コンパイルした。
a.c: In function `test':
a.c:7: 警告: データ型の範囲制限によって、比較が常に true となります
a.c:8: 警告: データ型の範囲制限によって、比較が常に false となります
a.c:10: 警告: データ型の範囲制限によって、比較が常に false となります
a.c:11: 警告: データ型の範囲制限によって、比較が常に false となります
a.c:12: 警告: 符合付きと符合無しとの比較です
実行した。
0x00 : (1)true (2)true (a)false (b)true (c)false (d)false (e)false
0x7f : (1)true (2)true (a)false (b)true (c)false (d)false (e)false
0x80 : (1)false (2)true (a)false (b)false (c)false (d)false (e)true
0x81 : (1)true (2)true (a)false (b)true (c)false (d)false (e)true
0xff : (1)true (2)true (a)false (b)true (c)false (d)false (e)true
(1) と (a) (d) は同じ結果にならなかった。
(b) は同じ結果になったが,char 型でないことは質問 8.9
に書いてある。
はにゃ? ってところで調査切り上げ。
他に仕事あるし。
仕事が終わってから,改めて考えてみた。
'\x80' は int 型でいうところの 0x80 (128) ではなく,char 型でいうところの 0x80 (-128) を int 型にキャストしたもの,と考えればつじつまが合うようだ。
テストコードを修正。
8: if ((int)(char)0x80 < value) printf(" (A)true "); else printf(" (A)false");
9: if ((int)(char)0x80 <= value) printf(" (B)true "); else printf(" (B)false");
コンパイる。
a.c: In function `test':
a.c:7: 警告: データ型の範囲制限によって、比較が常に true となります
a.c:9: 警告: データ型の範囲制限によって、比較が常に true となります
char 型の範囲は -128〜127 だから,「-128 以上かどうか」という比較は常に成立するぞ,と警告される。
実行。
0x00 : (1)true (2)true (A)true (B)true
0x7f : (1)true (2)true (A)true (B)true
0x80 : (1)false (2)true (A)false (B)true
0x81 : (1)true (2)true (A)true (B)true
0xff : (1)true (2)true (A)true (B)true
同じ結果になった。
これはとても参考になりました。ありがとうございます。
お陰でFirefox2.0にアップグレードする決心が付きました。
今はもう主要なアドオンはほぼ2.0に対応しましたから,良い時期かもしれないですね。