この質問は、unsigned へのキャストが適切であるという提案から生じています。 char は、 std::toupper や std::to lower などの文字操作関数を呼び出す前に必要です。ただし、Bjarne Stroustrup のコードは、これらの関数をキャストせずに使用しているようです。
Char Representation
Char、signed char、および unsigned char は、 C では異なる型です。 Char は、signed char または unsigned char と同等の範囲を表すことができます。 char が署名されるシステムでは、文字セット全体が負ではない値を持ちます。
toupper 関数
C 標準によれば、toupper は int 引数を受け入れ、戻り値を返します。 int の結果。入力値は unsigned char として表現できるか、EOF に等しい必要があります。そうでない場合、動作は未定義です。
未定義の動作
プレーン char が署名され、toupper に渡される値が負の場合、未定義の動作が発生します。これは、int への暗黙的な変換によって負の値が生成されるためです。
Unsigned Char へのキャスト
char 引数を unsigned char にキャストすると、値が負でないことが保証されます。 、未定義の動作を回避します。 char と unsigned char は同じサイズであっても、異なる値の範囲を表します。
実装
これらの関数は通常、ルックアップ テーブルを使用して実装されます。テーブルの境界を超えてインデックスを作成すると、未定義の動作が発生する可能性があります。結果が暗黙的に負の値に戻される場合、unsigned char に直接変換しても、この問題は回避できません。
例外: EOF
C の変更
C 標準は特定の C 標準ライブラリ関数のみを変更します。の機能の調整は行われていません。
結論
未定義の動作を回避するには、toupper、tower などを呼び出す前に char 引数を unsigned char にキャストする必要があります。 char が非負の符号付き型であっても関数を使用できます。
以上が`toupper()`、`to lower()`などを使用する前に、`unsigned char`にキャストする必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。