私のシステムでは: c++ の sizeof(long) は 4 別名 32 ビットです c# の sizeof(long) は 8 別名 64 ビットです
したがって、相互運用メソッドの宣言では、c++ の long を c# の int に置き換えていますが、これは安全ではないと感じていますか?
c++で long が int と同じサイズなのはなぜですか? そして長い長いは64ビットですか?長い長い長い長い次は何ですか??
私のシステムでは: c++ の sizeof(long) は 4 別名 32 ビットです c# の sizeof(long) は 8 別名 64 ビットです
したがって、相互運用メソッドの宣言では、c++ の long を c# の int に置き換えていますが、これは安全ではないと感じていますか?
c++で long が int と同じサイズなのはなぜですか? そして長い長いは64ビットですか?長い長い長い長い次は何ですか??
最近の C ライブラリを持っていると仮定して行う最善の方法は、, ,include <stdint.h>
を使用することです。これは、基盤となるプラットフォームのモデルに関係なく機能します。uint64_t
int64_t
uint32_t
int32_t
しかし、興味がある方のために説明すると、根底にある問題は、異なるシステムが異なるモデルを使用しているということです。32 ビット システムでは、Posix と Windows の両方が ILP32 を使用します。つまり、integer、long、point はすべて 32 ビット長です。
64 ビットの場合、Posix と Windows は異なるモデルを使用します。
Posix は通常 LP64 を使用します。これは、32 ビットの整数、64 ビットの長さ、および 64 ビットのポインターを意味します。
Windows は LLP64 を使用します。これは、32 ビットの整数と long、64 ビットの long と 64 ビットのポインターを意味します。
はい、プラットフォーム サイズの整数 (x86 プラットフォームでは 32 ビット、x64 プラットフォームでは 64 ビットなど) でない限り安全ですIntPtr
。
C(++) が定義された時点では、既定の計算サイズは 32 ビットではなかったことを忘れないでください。したがって、32 ビットは「長い」と定義されました。ただし、新しいプログラミング言語では、新しいデフォルト サイズが採用されています。
ほとんどのプラットフォームでは、C++long
は と同じでint
、4 バイトです。int
これは、 2 バイトで long がダブルワード (つまり 4 バイト) だった 16 ビット時代の残りの部分です。
したがって、C++ プラットフォームが 32 ビット long に依存している場合、それらを C# に変換することint
は十分に安全です。