unsigned
에 대해
std::abs(int)
을 비교있을 때 서명 대 부호없는 비교를 위해 경고 얻고있다
. 실제로 std::abs
은 서명 된 값을 반환합니다. 그 선택은 왜 만들어 졌습니까? 절대 값이 부호있는 유형으로 표현 될 수없는 음수 값 문제를 해결했을 것입니다.왜 표준 : ABS 반환 서명 않는 유형
그리고, 뭔가 청소기는이보다 경고를 방지하기 위해 (즉 캐스트하지 않고,)이 있습니까?
#include <cassert>
#include <cstdlib>
// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
return
(0 < rhs || static_cast<unsigned>(-rhs) < lhs
? rhs + lhs
: 1);
}
int main()
{
assert(add(42, -41) == 1);
assert(add(42, 0) == 43);
assert(add(42, 1) == 43);
assert(add(42, -51) == 1);
}
나는이 표준 근거에 많은 영향을 미쳤다 의심하지만, 실제로 unsigned'가 int''의 모든 절대 값을 나타낼 수'보장되지 않습니다. 이론 상으로는'int'가 33 비트 2의 보수이고'unsigned'가 32 비트 인 적합 구현을 할 수 있습니다. 그 구현에서'int'도'unsigned'도'INT_MIN'의 절대 값을 나타낼 수 없습니다. 왜 그런 구현이 필요한지 확실하지 않지만 합법적이므로 제안은 엄격하게 * 문제를 해결하지 않습니다. 표준은'abs (INT_MIN)'을 할 수없는 곳에 구현을 허용합니다! –
그리고 실제로, 당신이 할 수있는 int' '의 하나 개의 값이 있다는 사실은'abs' 정말 당신이 할 수있는 int''의 하나 개의 값이 있다는 사실보다 더 불편하지 않다 '-'. 그리고 마찬가지로'++ '를 할 수없는 값. C 및 C++의 작성자는 정의되지 않은 오버플로 동작을 제거 할만큼 충분히 미워하지 않습니다. –
@SteveJessop §3.9.1-3 ('unsigned int'와'int'를위한 같은 양의 저장 공간과 같은 객체 표현)에서 어떻게 가능합니까? –