gpt4 book ai didi

c++ - abs(unsigned long) 有什么意义吗?

转载 作者:IT老高 更新时间:2023-10-28 21:41:27 28 4
gpt4 key购买 nike

我遇到过这段代码,顺便说一下我的分析器报告为瓶颈:

#include <stdlib.h>

unsigned long a, b;
// Calculate values for a and b
unsigned long c;

c = abs(a - b);

那条线有没有比 c = a - b; 更有趣的事情? ?任何一个选项都调用未定义或实现定义的行为,还有其他潜在的陷阱吗?注意 C <stdlib.h>包括在内,而不是 <cstdlib> .

最佳答案

不,这没有意义。

如果你想要不同,请使用

c = (a > b) ? a - b : b - a;

c = max(a, b) - min(a, b);

如果低于零,无符号将回滚(效果类似于添加 2sizeof (unsigned long) * CHAR_BIT)

如果你正在寻找两个数字之间的差异,你可以写一个如下的小模板

namespace MyUtils {
template<typename T>
T diff(const T&a, const T&b) {
return (a > b) ? (a - b) : (b - a);
}
}

abs的声明继承自 C(因为你包含了 stdlib.h)

int       abs( int n );
long abs( long n );
long long abs( long long n ); // (since C++11)
//Defined in header <cinttypes>
std::intmax_t abs( std::intmax_t n ); // (since C++11)

还有 absC++ 中(来自 cmath)

float       abs( float arg );
double abs( double arg );
long double abs( long double arg );

如果您注意到,每个函数的参数和返回类型都是 signed。因此,如果您将无符号类型传递给这些函数之一,则会发生隐式转换 unsigned T1 -> signed T2 -> unsigned T1 (其中 T1T2 可能相同,而 T1 在您的情况下是 long )。将无符号整数转换为有符号整数时,如果不能以有符号类型表示,则行为取决于实现。

来自 4.7 积分转换 [conv.integral]

  1. If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [ Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation). — end note]
  2. If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

关于c++ - abs(unsigned long) 有什么意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27833289/

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