두 개의 32 비트 정수를 추가하면 정수 오버 플로우가 발생할 수 있습니다.
uint64_t u64_z = u32_x + u32_y;
32 비트 정수 중 하나가 먼저 캐스트되거나 64 비트 정수에 추가되는 경우 이러한 오버플로를 피할 수 있습니다.
uint64_t u64_z = u32_x + u64_a + u32_y;
그러나 컴파일러가 추가 순서를 변경하기로 결정한 경우 :
uint64_t u64_z = u32_x + u32_y + u64_a;
정수 오버플로가 계속 발생할 수 있습니다.
컴파일러가 이러한 재정렬을 수행 할 수 있습니까? 아니면 결과 불일치를 인식하고 표현식 순서를 그대로 유지할 수 있다고 믿을 수 있습니까?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
결과는 0
이지만 (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
결과는 이며이 0x100000000
두 값은 동일하지 않습니다. 따라서 컴파일러가 해당 변환을 적용 할 수 있는지 여부는 중요합니다. 하지만 표준은 부호없는 정수가 아닌 부호있는 정수에 대해서만 "오버플로"라는 단어를 사용합니다.
uint32_t
값 이 더해진 것처럼 보이기 때문에 실제로 정수 오버플로를 표시 하지 않습니다. 오버플로하지 않고 래핑합니다. 이것들은 다른 행동이 아닙니다.