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

lol*_*lol 0 c c# unsigned ulong

我在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
Run Code Online (Sandbox Code Playgroud)

但在我的C#代码中:

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

我不会动摇c和c#中这个添加操作的差异你会不会让我感到烦躁不安和我做错了?

Ian*_*Ian 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#
Run Code Online (Sandbox Code Playgroud)

因此,在您的C情况下,当您添加这两个值时,您将会溢出.

3372499074 + 2582066069 = 5954565143 (overflow) = (4294967296 + 1659597847) mod 4294967296 = 1659597847
Run Code Online (Sandbox Code Playgroud)

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

3372499074 + 2582066069 = 5954565143 (no overflow)
Run Code Online (Sandbox Code Playgroud)

CC#中查找更多数据类型值限制.另外,请查看这篇文章,以便更好地理解C数据类型的大小(dbushdelnan的答案特别有用.由于long数据类型没有一些标准化的大小C,有时可能有时4 bytes也有时8 bytes- 与C#对应的不同,ulong永远8 bytes)

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

uint64_t u64;
Run Code Online (Sandbox Code Playgroud)

  • @Mafii算术溢出与托管语言无关.管理只是意味着它会为您分配和取消内存分配. (2认同)
  • "无符号长数据大小是4个字节"..但并非总是如此,但在这种情况下可能是. (2认同)