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;
1条答案
按热度按时间nfg76nw01#
简短回答
你不能将2147483648存储在有符号的32位int中,即使你这样做了:
只要尝试
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可以存储的值的范围:
1.二的补码的第一个-4是100
1.然后通过
not(100)+1
->011+1
->100
反转2的补码(将其转换为正),这与-4完全相同,因此存储的结果是-4,这意味着绝对值(-4)也是-4,因为4不在有符号的3位整数范围内你也有同样的问题
解决方案
如果真的需要在变量中存储2147483648,你有一些选项
1.使用带符号的64位整型
1.使用两个变量,一个是无符号的32位int,另一个是布尔符号变量