我有一个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

但在我的密码里:
ulong[] S = (ulong[])hashtable[key];
ulong y = 2582066069;
y = y + S[d]; // s[d] = 3372499074 but the result is = 5954565143

我不想解开c和c中这个add操作的区别#
你能不能帮我解开我做错了什么?

最佳答案

在您的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)

了解CC#中的更多数据类型值限制。也可以查看this post以了解有关C数据类型大小的更多信息(dbushdelnan的答案特别有用。由于long中的C数据类型没有某种标准化的大小,in有时可能是4 bytes有时是8 bytes-与C#的对应项不同,ulong总是8 bytes
要在C中使用8 bytes unsigned integer数据类型,可以使用uint64_t数据类型
uint64_t u64;

10-08 04:16
查看更多