c++ 如何得到最小可能负整数的正整数值?

py49o6xq  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(137)

C++中int类型的最小可能值似乎是-2147483648
每当我的程序遇到一个负整数时,我希望它被转换成一个正整数(通过乘以-1):
if (n < 0) n = (-1) * n;
但是,让我很懊恼的是,编译器经常发出的警告是:
运行时错误:有符号整数溢出:-1\f25 * -2147483648-1不能用-1\f25 'int'-1(solution.cpp)-1类型表示未定义行为消毒剂:未定义行为
尽管编译器消息是自我解释的,但我找不到克服它的方法。
我遇到了一个像how to make negative numbers into positive这样的问题,但它使用了像fabs()abs()这样的库函数。我不想使用内置的库函数。
此外,Why the absolute value of the max negative integer -2147483648 is still -2147483648?显示了abs()的无用性(尽管是在C中)。
那么,除了使用这段代码之外,如何获得-2147483648的正值呢?
if (n == -2147483648) n = 2147483648;

nfg76nw0

nfg76nw01#

简短回答

你不能将2147483648存储在有符号的32位int中,即使你这样做了:

if(n==-2147483648)     n=2147483648;

只要尝试cout结果,它将是-2147483648,因此存储的值不正确

长应答

实际上,要理解为什么存储的值不同,您需要知道计算机如何存储有符号的int类型(具体为负值)
存储负值最简单的方法是将第一位作为符号指示符(0是正的,1是负的),但是如果我们使用这种方式,那么将有0和-0,它们是相同的值,所以我们使用另一种方法two's complement来存储负值,并且在负部分中只给我们一个0和另一个数字(比正数多)

    • 举个小例子:**

假设我们需要将-2存储在一个有符号的3位int中(为了简单起见):
1.首先,我们需要将2从十进制转换为二进制,结果为010
1.其次,我们需要取010的two's complement将其从正数转换为负数,结果为110,这就是如何将-2存储在有符号的3位int中
现在让我们看看一个有符号的3位int可以存储的值的范围:

  • 从-4到3(负数比正数多,因为我们将负数存储在2的补码中)
    • 现在**让我们尝试将-4转换为4(不在有符号3位int的范围内),以查看存储的结果

1.二的补码的第一个-4是100
1.然后通过not(100)+1-> 011+1-> 100反转2的补码(将其转换为正),这与-4完全相同,因此存储的结果是-4,这意味着绝对值(-4)也是-4,因为4不在有符号的3位整数范围内
你也有同样的问题

解决方案

如果真的需要在变量中存储2147483648,你有一些选项
1.使用带符号的64位整型
1.使用两个变量,一个是无符号的32位int,另一个是布尔符号变量

相关问题