在 C 和 C# 中添加两个无符号值

add two unsigned value in C and 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 案例中,unsigned long 数据大小为 4 bytes,而在 C# 中,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 情况下,当您将两个值相加时,您将溢出。

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

但在您的 C# 情况下,ulong 数据类型仍然能够保存值而不会溢出。

3372499074 + 2582066069 = 5954565143 (no overflow)

C and in C#. Also check out for more understanding on C data type size (dbush's and delnan 的答案中了解更多数据类型值限制特别有帮助。由于 C 中的 long 数据类型没有一些标准化的大小,in 有时可能是 4 bytes 有时是 8 bytes - 与 C# 的对应物不同, ulong 总是 8 bytes)

要在 C 中使用 8 bytes unsigned integer 数据类型,您可以使用 uint64_t 数据类型

uint64_t u64;