在unsigned int中存储负数

时间:2014-08-12 05:22:40

标签: c++ c memory-management unsigned-integer

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

我GUESS正在发生的是函数猜测数据的数量小于0,又称-1到-9,当它将该数字分配给unsigned int时,它将数字包装为最大值或关闭到最大数量。

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

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

编辑:我想知道的是,假设尝试将负数分配给无符号整数会导致将整数设置为最大数量(即4,294,967,295)是否有效。如果这是不可能的那么好吧,我不是在查看SPECIFICS究竟为什么这会发生在程序中,因为我无法访问代码。所有我想知道的是,是否可能,因此可能解释为什么我得到这些结果。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你可以想到负数使其第一位计数为负数。

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。

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

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