C ユーザーズガイド

大域動作: 値保存と符号なし保存

符号なし保存算術変換に依存しているプログラムの動作は以前とは異なっています。これは、K&R C と ANSI C の最も大きな違いです。

K&R による『プログラミング言語 C』(共立出版、1978 年) の中では、unsigned は型を正確に 1 つだけ指定していました。そのときは unsigned char、unsigned short、unsigned long はありませんでしたが、その後間もなくほとんどの C コンパイラがこれらを追加しました。

以前の C コンパイラでは、符号なし保存規則が拡張 (promotion) のときに使用されます。すなわち、符号なし型が拡大を必要とするときは符号なし型に拡大され、符号なし型が符号付き型と混合されると結果として符号なし型になります。

これに対して ANSI C の規則は、値保存と呼ばれています。この保存規則では、結果の型はオペランドの型のサイズ間の関係によって決定されます。unsigned char または unsigned short が拡張されると、結果の型は int の大きさがその値全部を表現するのに十分なものであれば int です。それ以外の場合、結果の型は unsigned int です。値保存規則は、ほとんどの式で最も妥当な算術結果となります。

コンパイラは、-Xt モードと -Xs モードでだけ符号なし保存拡張規則を使用します。他のモード、すなわち -Xc モードと -Xa モードでは、値保存拡張規則が使用されます。-xtransition オプションを使用した場合は、使用される拡張規則によって動作が異なる可能性のある式があれば、コンパイラは式ごとに警告を発します。