私はC#開発者であり、この言語では、プラットフォームに関係なく「int」は常に32ビット(32ビットと64ビット)、「long」は常に64ビット、floatは32、double64であるとほぼ確信しています。すぐ。
それが好きではない言語はありますか?intサイズはプロセッサによって異なりますか?
私はC#開発者であり、この言語では、プラットフォームに関係なく「int」は常に32ビット(32ビットと64ビット)、「long」は常に64ビット、floatは32、double64であるとほぼ確信しています。すぐ。
それが好きではない言語はありますか?intサイズはプロセッサによって異なりますか?
C / C ++のintなどのサイズは、正式には定義されていません。コンパイラ固有です。詳細については、こちらをご覧ください。
ありがたいことに、C#の設計者は仕様で正式に指示しました:int = System.Int32、long=System.Int64など-変更について心配する必要はありません。x64で簡単にわかる唯一の違いはですIntPtr.Size
。
たとえば、C++ では、intはプロセッサの「自然な」ワード サイズとして定義されています。limits.h (またはclimits、どちらも標準ライブラリの一部) を見ると、 int 型の有効な範囲を定義する INT_MIN および INT_MAX 定数が表示されます。INT_MIN が -32767 以下で、INT_MAX が 32767 以上である必要があります。
この質問で述べたように:
Java 言語仕様では、整数の表現方法と整数算術式の評価方法が正確に定義されています。このプログラミング言語はインターネット上の分散アプリケーションで使用するように設計されているため、これは Java の重要な特性です。Java プログラムは、それを実行するターゲット マシンに関係なく、同じ結果を生成する必要があります。
対照的に、C (および広く使用されている命令型およびオブジェクト指向プログラミング言語の大部分) は、よりずさんで、多くの重要な特性が未解決のままです。この不正確な言語仕様の背後にある意図は明らかです。同じ C プログラムは、ターゲット プロセッサに組み込まれた算術演算を使用してソース プログラムの整数演算をインスタンス化することにより、16 ビット、32 ビット、さらには 64 ビット アーキテクチャで実行されることになっています。これにより、使用可能なマシン操作を直接使用できるため、コードがはるかに効率的になります。整数計算が「十分に小さい」数値のみを扱う限り、矛盾は発生しません。
この意味で、C 整数演算は、プログラミング言語の仕様によって正確に定義されていないが、ターゲット マシンを決定することによってのみ完全にインスタンス化されるプレースホルダーです。
Java は、整数の表現方法と整数演算の計算方法を正確に定義します。
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char は唯一の符号なし整数型です。
\u0000
その値は からまで\uffff
、つまり 0 から 2 16 -1までのUnicode 文字を表します。整数演算子に long 型のオペランドがある場合、もう一方のオペランドも long 型に変換されます。それ以外の場合、演算は int 型のオペランドに対して実行され、必要に応じて短いオペランドは int に変換されます。変換規則は正確に指定されています。
[Electronic Notes in Theoretical Computer Science 82 No. 2 (2003)
Blesner-Blech-COCV 2003: Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Germany より]
C および C++ では、可変サイズの int を使用できます... 私が覚えている限り、唯一の要件は small <= int <= long です。したがって、確かに、コンパイラは 32 ビット マシンで 32 ビット int を生成し、64 ビット マシンで 64 ビット int を生成できます。
ちなみに、C# の float と double のサイズはストレージ用にのみ定義されています。変数は追加の精度を使用できます。したがって、次の条件:
class Foo
{
private float _v = ...; // Definitely 32-bit.
void Test()
{
var v = _v; // Could be 32-, 64-, or 96-bit.
if(v == _v) {
...
}
}
}
実行される場合と実行されない場合があります。(執筆時点では、CLR は通常、可能であればリリース モードで 96 ビット FP レジスタを使用します)。
Marc Gravell が C++ で述べたように、すべてのプラットフォームに対して公式にほぼ固定サイズが定義されている唯一の型はchar >= 8 ビットです。
他の型は char よりも大きくなりますが、そのサイズはプラットフォーム/コンパイラの実装に関連しています。標準では、魔女は他の魔女よりも大きくする必要があるとのみ指定されています。
c# は、サイズが実行可能IntPtrのプロセッサ、OS、およびビットネス フラグに依存する型を提供します。
また、それ自体が参照型を保持する型は、参照自体が 32/64 ビットであるため、32/64 ビットではサイズが異なります。
CLR は、ビット数に応じてすべて可変サイズの次の型を提供します。
C/C++ 標準で指定されているのは、異なるデータ型のサイズ間の順序関係だけです。実装に応じてさまざまなサイズが可能であり、ほとんどの場合、構築する CPU アーキテクチャによって異なります。実際、GCC では long は常にワード サイズです (Linux カーネル コードはこの保証に依存しています)。
適切なプログラミング プラクティスは、ハードコーディングされたサイズの代わりに sizeof() を使用することを意味します。
float と double のサイズは IEEE 標準であり、コンピュータのものではありません。そのため、float と double を実装する C#、Java、C、C++、および他のすべての言語には、まったく同じ丸めの問題があり、実際にはお金の計算や精度が必要な計算には使用できません。
short、int、long のサイズは言語仕様で定義されています。ただし、それらの数値で計算を行うときに恣意的な動作につながる可能性があるため、それらを完全に恣意的にすることは望ましくありません。それらはIEEE標準でもあるかもしれませんが、よくわかりません。