21

C 標準には次のように記載されています。

ISO/IEC 9899:1999、6.2.5.15 (p. 49)

char、signed char、unsigned char の 3 つの型をまとめて文字型と呼びます。実装では、signed char または unsigned char と同じ範囲、表現、および動作を持つように char を定義する必要があります。

実際、gccはターゲット プラットフォームに従ってそれを定義します。

私の質問は、なぜ標準がそうするのですか? 厄介で見つけにくいバグを除いて、あいまいな型定義から生じるものは何も見えません。

さらに、ANSI C (C99 より前) では、バイトサイズの型は char のみであるため、数学に char を使用することは避けられない場合があります。したがって、「数学に char を使用してはならない」というのは正しくありません。charその場合は、「 、ubyte、 」の3 つのタイプを含めた方が賢明sbyteです。

それには理由がありますか、それとも、悪い (しかし一般的な) コンパイラを標準互換として定義できるようにするための、奇妙な後方互換性の問題ですか?

4

5 に答える 5

26

unspecified signed-ness を持つ「プレーン」char を使用すると、コンパイラは、ターゲット アーキテクチャにとってより効率的な表現を選択できます。一部のアーキテクチャでは、1 バイト値を「int」のサイズにゼロ拡張すると、必要な操作が少なくなります (したがって、プレーン char ' を作成します)。 unsigned')、他の命令セットでは符号拡張がより自然になり、プレーン char は signed として実装されます。

于 2009-05-27T06:43:40.187 に答える
12

おそらく歴史的に、いくつかの実装の「char」は署名されていて、いくつかは署名されていなかったため、両方と互換性を保つために、どちらか一方として定義できませんでした。

于 2009-05-27T06:42:09.050 に答える
6

古き良き時代には C が定義され、文字の世界は 7 ビットだったので、符号ビットは他のもの (EOF など) に使用できました。

于 2009-05-27T08:03:29.890 に答える
1

On some machines, a signed char would be too small to hold all the characters in the C character set (letters, digits, standard punctuation, etc.) On such machines, 'char' must be unsigned. On other machines, an unsigned char can hold values larger than a signed int (since char and int are the same size). On those machines, 'char' must be signed.

于 2010-12-08T04:31:38.157 に答える
0

私は(私の頭の中で)彼らの考えは次のようなものだったと思います:

char の符号 (バイトとして使用) が気になる場合は、signed または unsigned char を明示的に選択する必要があります。

于 2009-05-27T06:32:17.723 に答える