実はchar
、signed char
とunsigned char
は 3 つの異なるタイプです。標準 (ISO/IEC 9899:1990) から:
6.1.2.5 タイプ
...
char、signed char、
unsigned charの 3 種類をまとめて文字型と呼びます。
(そして、たとえば C++ では、char 引数がある場合、それらの 3 つのバリアントを使用してオーバーライド関数を作成する必要があります (または少なくとも作成する必要があります)。
プレーン char は、コンパイラによって符号付きまたは符号なしで処理される可能性がありますが、標準では次のように述べられています (6.1.2.5 でも):
char型として宣言されたオブジェクトは、基本実行文字セットの任意のメンバーを格納するのに十分な大きさです。5.2.1 で必要なソース文字セットのメンバーが
charオブジェクトに格納されている場合、その値は正であることが保証されます。他の数量がcharオブジェクトに格納されている場合、動作は実装定義です。値は符号付きまたは非負の整数として扱われます。
と
signed char 型として宣言されたオブジェクトは、''プレーンな'' charオブジェクトと同じ量のストレージを占有します。
5.2.1 で言及されている文字は、A ~ Z、az、0 ~ 9、スペース、タブ、改行、および次の 29 のグラフィック文字です。
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
答え
基本的に、128 未満の値を持つ ASCII 文字は正であることが保証されていることを意味すると解釈します。したがって、格納された値が常に 128 未満であれば、(値を保持するという観点から) 安全であるはずですが、あまり良い方法ではありません。