2012-01-19 16 views
2

Cでショートの範囲が異なるマシンで異なるかどうかは誰にでも分かります。たとえば、短絡が2バイトで、1の補数マシンで短絡の範囲が-32767 ~ 32767になり、2の補数のマシンで範囲が-32768 ~ 32767になります。前もって感謝します。"short"の範囲はマシンによって異なりますか?

+2

ショートが4バイトの場合、範囲は-2147483648〜2147483647程度になります。それは実際に起こりうる。 –

+0

これらの1の補完機械のうちの1つを見つけたらお知らせください。 –

+0

@GregHewgill 1の補完機械がないことを意味しますか? – John

答えて

10

はい、タイプshortの範囲とサイズは、マシンによって異なります。同じマシン上の異なる実装間でも異なることがあります。

最も一般的な表現は、パディングビットまたはトラップ表現を持たない16ビット、2の補数で、-32768〜+32767の範囲です。

C標準では、shortは、を少なくとも -32767〜+32767の範囲でカバーする必要がありますが、それ以上にすることもできます。

shortが32ビット(Cray T3E)または64ビット(Cray T90)のシステムで作業しました。

可能であれば、shortの特定の範囲またはサイズを想定しないコード、またはその他の定義済みのタイプのコードを記述する必要があります。範囲が必要な場合は、で定義されたSHRT_MINSHRT_MAXを使用し、サイズが必要な場合はsizeof (short)(または、sizeof objの場合はobjshortのオブジェクト)を使用してください。

あなたは<stdint.h><inttypes.h>で定義された正確 16ビット、使用int16_t、だタイプが必要な場合。 (これらのヘッダはC標準の1999バージョンで追加されましたが、ほとんどのコンパイラは、それらをサポートする必要があります。)

をオーバーフローについて尋ねるあなたのコメントへの返信オーバーフローの

質問あなたがいるときに少しトリッキー取得しますタイプshortについて話しています。 32767のような整数のリテラルは決してshortではありません。それらは常にタイプintまたはそれ以上のものです。算術演算子のオペランドには、最初に「通常の算術変換」が適用されます。 shortオペランドは静かにintに昇格されます。

Cでは、short+演算子はありません。

だから、このことを考慮してください。

short x = 32767; 
x = x + 1; 

を表現x + 1では、オペランドxintshortから昇格される(と1はタイプintですでにあります)。その結果、タイプintの結果が得られます。intがその値を格納するのに十分な場合は、32768になります。 (そうでない場合は、オーバーフローは未定義の動作の原因となるが、我々はそれを無視します。)その後int32768あるxに格納される前にintからshortを変換します。

SHRT_MAX > 32767の場合は問題ありません。変換は32768の期待値をもたらし、これはxに格納されます。

しかしC99セクション6.3に記載されているように(最も一般的なケースである)SHRT_MAX == 32767場合は、次にshortint32768の変換は、実装定義値をもたらす(または実装定義信号を上昇させます) .1.3。

ほとんどの場合、実際の結果は-32768であり、システムが2の補数を使用する場合はshortと表現できます(ほぼすべてのシステムがそうです)。しかし、厳密に言えば、コードは移植性がありません。xに他の任意の結果を格納することもできますし、実装がシグナルを発生させる場合はプログラムを終了することもできます。

+0

ありがとうございます。したがって、オーバーフローの値はマシンによって異なりますか?たとえば、32767 + 1 = -32767または32768とCは処理しません。 – John

+0

@ジョン:基本的にはい、それよりも複雑です。私の更新された答えを見てください。 –

1

標準の同じ言語で、すべての整数型に適用されます(整数表現はC99とC11の両方で6.2.6.2です)。

関連する問題