0

私はcでそれを書くべきであるという計算をcで持っています#

これはcの私のコードです:

const unsigned long *S //which is an array that already contains data ) 
unsigned long  y;
y = y + S[d]; //S[d] = 2582066069 and y = 3372499074 and the results is 1659597847

しかし、私のC#コードでは:

ulong[] S = (ulong[])hashtable[key];
ulong y = 2582066069;
y = y + S[d]; // s[d] = 3372499074 but the result is = 5954565143

私は、c と c# でのこの追加操作の違いを理解していません。

4

1 に答える 1

5

あなたのC場合、unsigned longデータサイズは です4 bytesC#ulongデータサイズは8-bytesです。

unsigned long   4 bytes 0 to 4,294,967,295 //in C
ulong           8 bytes 0 to 18,446,744,073,709,551,615 //in C#

したがって、あなたのC場合、2 つの値を追加すると、オーバーフローが発生します。

3372499074 + 2582066069 = 5954565143 (overflow) = (4294967296 + 1659597847) mod 4294967296 = 1659597847

しかし、あなたのC#場合、ulongデータ型はオーバーフローすることなく値を保持できます。

3372499074 + 2582066069 = 5954565143 (no overflow)

CおよびC#でのデータ型の値の制限の詳細を確認してください。また、データ型のサイズについての理解を深めるために、この投稿をチェックしてください( dbushdelnanの回答は特に役立ちます。 in のデータ型には標準化されたサイズがないため、 inの対応するものとは異なり、は常に)ClongC4 bytes8 bytesC#ulong8 bytes

8 bytes unsigned integerCでデータ型を使用するには、データuint64_t型を使用できます

uint64_t u64;
于 2016-03-24T11:28:58.527 に答える