나는 std::gcd
예기치 않은 것을 발견 한이 행동을 보았습니다 .
#include <iostream>
#include <numeric>
int main()
{
int a = -120;
unsigned b = 10;
//both a and b are representable in type C
using C = std::common_type<decltype(a), decltype(b)>::type;
C ca = std::abs(a);
C cb = b;
std::cout << a << ' ' << ca << '\n';
std::cout << b << ' ' << cb << '\n';
//first one should equal second one, but doesn't
std::cout << std::gcd(a, b) << std::endl;
std::cout << std::gcd(std::abs(a), b) << std::endl;
}
cppreference 에 따르면 모든 전제 조건이 충족 되므로 두 호출 모두 std::gcd
yield 가 되어야합니다 10
.
특히 두 피연산자 의 절대 값 은 공통 유형으로 표시 할 수 있어야합니다 .
| m | 또는 | n | type의 값으로 표현할 수없는
std::common_type_t<M, N>
경우 동작이 정의되지 않습니다.
그러나 첫 번째 호출은을 반환합니다 2
. 여기에 뭔가 빠졌습니까? gcc와 clang은이 방식으로 작동합니다.
흥미롭게도 GCC는 값 만 int를 인쇄에 2의 int를 컴파일하고 서명하지 않습니다 : godbolt.org/z/koEVHh
—
앨런 Birtles
무엇입니까
—
TC
-120 % 10u
? (힌트 : 0이 아닙니다.) 그렇습니다.
@TC 예는 캐스팅
—
dave
-120
에 unsigned
발생합니다 4294967176
하는 % 10u
것입니다 6
. 내 행동은 실제로이 행동이 실제로 부정확 한 것인지에 대한 것이 었습니다.
@AlanBirtles이 경우에 캐스트
—
dave
unsigned
되지 않으므로 버그도 없습니다.