gpt4 book ai didi

c++ - 一元减号和有符号到无符号的转换

转载 作者:可可西里 更新时间:2023-11-01 15:11:06 25 4
gpt4 key购买 nike

这在技术上总是正确的吗:

unsigned abs(int n)
{
if (n >= 0) {
return n;
} else {
return -n;
}
}

在我看来,如果 -INT_MIN > INT_MAX,当 n == INT_MIN 时,“-n”表达式可能溢出,因为 -INT_MIN 超出范围。但是在我的编译器上这似乎工作正常...这是一个实现细节还是可以依赖的行为?

更长的版本

一些上下文:我正在为 GMP 整数类型 (mpz_t) 编写一个 C++ 包装器,并从现有的 GMP C++ 包装器(称为 mpz_class)中汲取灵感。在处理带有符号整数的 mpz_t 的加法时,有如下代码:

static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
{
if (l >= 0)
mpz_add_ui(z, w, l);
else
mpz_sub_ui(z, w, -l);
}

换句话说,如果有符号整数是正数,则使用无符号加法例程将其相加,如果符号整数为负数,则使用无符号减法例程将其相加。两个 *_ui 例程都将 unsigned long 作为最后一个参数。是表达式

-l

有溢出的危险吗?

最佳答案

如果你想避免溢出,你应该先投n到一个无符号整数,然后对其应用一元减号。

unsigned abs(int n) {
if (n >= 0)
return n;
return -((unsigned)n);
}

在您的原始代码中,否定发生在类型转换之前,因此如果 n < -INT_MAX 则行为未定义。 .

对无符号表达式求反时,永远不会溢出。相反,结果将取模 2^x ,对于 x 的适当值.

关于c++ - 一元减号和有符号到无符号的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4536095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com