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