Cでショートの範囲が異なるマシンで異なるかどうかは誰にでも分かります。たとえば、短絡が2バイトで、1の補数マシンで短絡の範囲が-32767 ~ 32767
になり、2の補数のマシンで範囲が-32768 ~ 32767
になります。前もって感謝します。"short"の範囲はマシンによって異なりますか?
答えて
はい、タイプshort
の範囲とサイズは、マシンによって異なります。同じマシン上の異なる実装間でも異なることがあります。
最も一般的な表現は、パディングビットまたはトラップ表現を持たない16ビット、2の補数で、-32768〜+32767の範囲です。
C標準では、short
は、を少なくとも -32767〜+32767の範囲でカバーする必要がありますが、それ以上にすることもできます。
short
が32ビット(Cray T3E)または64ビット(Cray T90)のシステムで作業しました。
可能であれば、short
の特定の範囲またはサイズを想定しないコード、またはその他の定義済みのタイプのコードを記述する必要があります。範囲が必要な場合は、で定義されたSHRT_MIN
とSHRT_MAX
を使用し、サイズが必要な場合はsizeof (short)
(または、sizeof obj
の場合はobj
はshort
のオブジェクト)を使用してください。
あなたは<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
では、オペランドx
はint
にshort
から昇格される(と1
はタイプint
ですでにあります)。その結果、タイプint
の結果が得られます。int
がその値を格納するのに十分な場合は、32768
になります。 (そうでない場合は、オーバーフローは未定義の動作の原因となるが、我々はそれを無視します。)その後int
値32768
はあるx
に格納される前にint
からshort
にを変換します。
SHRT_MAX > 32767
の場合は問題ありません。変換は32768
の期待値をもたらし、これはx
に格納されます。
しかしC99セクション6.3に記載されているように(最も一般的なケースである)SHRT_MAX == 32767
場合は、次にshort
にint
値32768
の変換は、実装定義値をもたらす(または実装定義信号を上昇させます) .1.3。
ほとんどの場合、実際の結果は-32768
であり、システムが2の補数を使用する場合はshort
と表現できます(ほぼすべてのシステムがそうです)。しかし、厳密に言えば、コードは移植性がありません。はx
に他の任意の結果を格納することもできますし、実装がシグナルを発生させる場合はプログラムを終了することもできます。
ありがとうございます。したがって、オーバーフローの値はマシンによって異なりますか?たとえば、32767 + 1 = -32767または32768とCは処理しません。 – John
@ジョン:基本的にはい、それよりも複雑です。私の更新された答えを見てください。 –
標準の同じ言語で、すべての整数型に適用されます(整数表現はC99とC11の両方で6.2.6.2です)。
- 1. Is値の範囲はデータ型のサイズによって異なりますか?
- 2. デルファイアプリ、フォームサイズはマシンによって異なります
- 3. unsigned shortとunsigned int - 時には同じ範囲ですか?
- 4. プレーン・アレイの作業範囲はどのようになっていますか?
- 5. 異なる範囲のプライベートサブワークシートイベント
- 6. python - より大きな範囲から範囲を引く
- 7. 範囲によってフラグメントを作成
- 8. 異なる範囲にコピーするVBA
- 9. 制限範囲は、私はこのようになりますいくつかのコードを持っている
- 10. 参照によってローカル変数を取得して範囲外になるとどうなりますか?
- 11. Castle.Windsorのライフスタイルは状況によって異なりますか?
- 12. AppCompatButtonの高さはデバイスによって異なりますか?
- 13. 'WORD': 'char [20]'は 'unsigned short'からの間接的なレベルが異なります
- 14. カットストリングと異なる範囲にペースト:VBA
- 15. のJava整数対INT - 私は次のJavaを持って、異なる範囲
- 16. スライドは日によって異なりますか?
- 17. フロートサイズはオペレーティングシステムによって異なりますか?
- 18. Webgl bindBuferとvertexAttribPointerはバッファサイズによって異なりますか?
- 19. Gitブランチ名はOSによって異なりますか?
- 20. STLマップイテレータは、インクリメントによって範囲外に移動できますか?
- 21. 生成ポイントが互いに異なる範囲内にありませんか?
- 22. 致命的なエラーインデックスが範囲外になっています
- 23. 範囲外になっているとPreparedStatement throwing indexが範囲外です
- 24. Googleマップのカスタムオーバーレイは、現在の地図の範囲内にあるかどうかによって異なります。
- 25. 最初の列(範囲の重複なし)によってソート範囲を持つファイルが存在する場合は1つの範囲は、別の
- 26. SQLクエリは、範囲または最寄りの範囲
- 27. removeAtIndexでSwiftのインデックスが範囲外になっています
- 28. リストのインデックスがPythonで範囲外になっています
- 29. Qgis:IndexError:リストのインデックスが範囲外になっています
- 30. Golangのインデックスが範囲外になっています
ショートが4バイトの場合、範囲は-2147483648〜2147483647程度になります。それは実際に起こりうる。 –
これらの1の補完機械のうちの1つを見つけたらお知らせください。 –
@GregHewgill 1の補完機械がないことを意味しますか? – John