2016-03-24 12 views
0

私はCで2つの符号なしの値を追加し、C#

これは私のコードが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# と誤解していませんか?あなたのC場合

+0

を使用することができます2つの計算の例番号? – crashmstr

答えて

5

C#で、ulongデータサイズが8-bytesありながら、unsigned longデータサイズは4 bytesです。あなたのC場合、このように

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# 

あなたは2つの値を追加するとき、あなたはオーバーフローを取得します。

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

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

3372499074 + 2582066069 = 5954565143 (no overflow) 

C中とC#におけるデータ型の値の制限の詳細をご覧ください。またCデータ型のサイズ(dbushにもっと理解するためにthis postをチェックアウト年代とdelnanClongデータ型のいくつかの標準化されたサイズがないのでsの答えは、時には4 bytes、時には8 bytesすることができるで、特に有用である - 。とは異なりC#の対応、ulongは常に8 bytesです)

Cで8 bytes unsigned integerデータ型を持っているために、あなたはuint64_tデータ型あなたはまったく同じを使用していないのはなぜ

uint64_t u64; 
+0

正しいですが、これはCエラーです.C#は管理されています。 C#でCのようにオーバーフローを再現することはできません。あなたは、モジュロ(%)演算子を使用して、その正確なシナリオで等しい動作を再現することができます。 – Mafii

+0

@Mafiiそれは間違っています。 C#にはオーバーフローをチェックして例外をスローする機能がありますが、コンパイラレベルや 'checked'と' unchecked'のコードでオン/オフを切り替えることができます。 – juharr

+0

ああ、私はそれを知らなかった。コードはまだ管理されていますか? – Mafii

関連する問題