부호있는 정수는 부호 비트가 -(2^N)
인 2의 보수를 통해 x86에 표현됩니다. 그 결과 대표적인 값 범위는 -2^N
과 2^N - 1
사이입니다 (예 : -32768
에서 32767
까지).INT_MIN * -1은 x86에서 작동하지 않습니까?
내 시스템에서 최소 부호있는 정수 값을 가져 와서 -1
으로 곱하면 시스템에서 부호있는 정수의 최대 표현 가능 값보다 큰 최대 값을 "강제 설정"하려고 할 때 궁금한 점이있었습니다.
#include <stdio.h>
#include <limits.h>
int main(void){
signed int x, y;
x = INT_MIN;
y = x * -1;
printf("%d\n%d\n", x, y);
return 0;
}
이 다음과 같은 출력 결과 :
# gcc -std=c89 -pedantic int_min_test.c
# ./a.out
-2147483648
-2147483648
내가 (전형적인 값 롤오버 결과) 정수 오버 플로우를 기대했지만, 아무런 조작 x
의 곱셈에 대한 일어났다없는 것처럼 나타납니다 -1
.
INT_MIN
과 -1
의 곱셈에 x86을 사용합니까?
롤오버가 가능한 가장 작은 값을 다시 생성하지 않습니까? –
정의되지 않은 동작 (2의 보수) - x86과 관련이 없습니다. –
@KerrekSB가 말한 바. UB없이 이것을 관찰하고 싶다면 부호없는 타입을 사용하십시오. –