【问题标题】:add two unsigned value in C and C#在 C 和 C# 中添加两个无符号值
【发布时间】:2023-04-08 14:51:01
【问题描述】:

我在 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# c unsigned ulong


【解决方案1】:

在您的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 数据类型在@987654340 中没有一些标准化大小@,有时可能是 4 bytes,有时可能是 8 bytes - 与 C# 的对应项不同,ulong 始终是 8 bytes)

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

uint64_t u64;

【讨论】:

  • 正确,这是一个C错误,C#是托管的。您不能像在 C 中使用 C# 那样重现溢出。您可以使用模 (%) 运算符为该确切场景重新创建相同的行为。
  • @Mafii 这不正确。 C# 具有检查溢出和抛出异常的能力,但可以在编译器级别或在带有checkedunchecked 的代码中打开或关闭。
  • @Mafii 算术溢出与它是托管语言无关。托管只是意味着它会为您处理内存的分配和取消分配。
  • “无符号长数据大小为 4 个字节”.. 并非总是如此,但在这种情况下可能会。
  • uint64_t 会比unsigned long long 更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2011-10-11
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多