在 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;
我在 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 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;