将负数存储在无符号整数中[关闭]

Posted

技术标签:

【中文标题】将负数存储在无符号整数中[关闭]【英文标题】:Storing negative number in an unsigned int [closed] 【发布时间】:2014-08-12 05:22:39 【问题描述】:

我可以访问我正在运行的程序,该程序应该为某些事情猜测一个非常低的数字并输出该数字(可能是 0 或 1)。然而,当它应该输出 0 的时候,有 0.2% 的时间会输出 4,294,967,286 - 4,294,967,295 之间的数字。 (注意:后者是无符号整数的最大数)。

我猜发生的事情是函数猜测数据的数量小于 0 也就是 -1 到 -9,当它将该数字分配给无符号整数时,它会将数字环绕为最大值或关闭到最大数量。

因此,我假设程序是用 C 编写的(我无权访问源代码),然后在 Visual Studio .NET 2012 C 中测试如果我将各种负数分配给无符号整数会发生什么情况。不幸的是,似乎什么也没发生——它仍然会将数字作为负整数输出到控制台。我想知道这是否与 MSVS 2012 试图变得聪明或其他原因有关。

无论如何,我是否正确假设这实际上是正在发生的事情以及程序输出最大数量的 unisnged int 的原因?或者还有其他正当理由说明为什么会发生这种情况?

编辑:我只想知道是否可以假设尝试将负数分配给无符号整数会导致将整数设置为最大数,即 4,294,967,295。如果这是不可能的,那么好吧,我不会详细说明为什么程序会发生这种情况,因为我无权访问代码。我只想知道这是否可能,因此可以解释为什么我会得到这些结果。

【问题讨论】:

就像我说的 - 我无权访问该程序的源代码。除非您说我的上述假设是正确的,并且您想查看我的代码以了解为什么它也没有输出数字 4,294,967,295? 这个问题似乎离题了,因为它是关于猜测我们无权访问的二进制程序。 伴侣我只想知道这是否是导致这种情况发生的可能原因 - 以及是否有任何其他常见的解释。我知道如何使用调试器——我也无法访问程序本身,只能访问输出。 " 它仍然会将数字作为负整数输出到控制台。" - 我猜你会通过使用 %dprintf 来导致未定义的行为用于无符号整数 @MattMcNabb 你是对的。谢谢。 【参考方案1】:

在 C 和 C++ 中,将 -1 分配给无符号数将为您提供最大的无符号值。

这是由标准保证的,我知道的所有编译器(甚至 VC)都正确实现了这部分。可能您的 C 示例还有一些其他问题,因为没有显示此结果(不能说没有看到代码)。

【讨论】:

谢谢我的好人 - 这就是我想知道的。你能解释一下为什么我的问题值得 -3 和评论说它是如何跑题的吗?我不明白它有什么问题。我很好奇与编程相关的东西是如何工作的,所以我认为这是一个发帖的好地方。 您的问题引发了对来源的讨论和猜测。这不在***的格式之内......有时听起来很奇怪。我会 +1 你只是为了抵消负面因素。 @Mitchell:我看不出这个问题有什么问题(除了已经以稍微不同的形式复制了几次)。发布您的测试代码可以说明为什么您没有得到预期的行为。【参考方案2】:

您可以认为负数的第一位是负数。

4 位整数是

Binary       HEX      INT4          UINT4
(In Memory)           (As decimal)  (As decimal)
0000         0x0      0             0 (UINT4_MIN)
0001         0x1      1             1
0010         0x2      2             2
0100         0x4      4             4
0111         0x7      7 (INT4_MAX)  7
1000         0x8      -8 (INT4_MIN) 8
1111         0xF      -1            15 (UINT4_MAX)

可能是某个库的头在骗你,值为负数。

如果库没有其他方法可以告诉您错误,这可能是故意的错误值。我以前见过以这种方式使用的“荒谬”值。 如果发生错误,错误可以计算为(UINT4_MAX - error) 或始终为 UINT4_MAX。

真的,没有任何源代码,这是一个猜谜游戏。

编辑: 我稍微扩展了说明表。 如果您想记录这样的数字,您可能希望以十六进制形式记录它。如果您习惯了 Hex 视图,您可以更快地查看内存。

【讨论】:

以上是关于将负数存储在无符号整数中[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在无符号字符的 std::vector 处存储 int 的十六进制表示

有符号整数与无符号整数

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

[C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]

[C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]

如何将以“\ 0”开头的char *转换为无符号整数? [关闭]