음의 int가 부호 없는 int보다 큰 이유는 무엇입니까?
int main(void)
{
unsigned int y = 10;
int x = – 4;
if (x > y)
Printf("x is greater");
else
Printf("y is greater");
getch();
return (0);
}
Output: x is greater
저는 서명이 안 된 것이기 때문에 출력이 더 클 것으로 생각했습니다.이것의 배경은 무엇입니까?
왜냐하면.int
값이 다음 값으로 승격됨unsigned int
구체적으로0xFFFFFFFC
32비트 시스템에서, 즉unsigned int
이라4294967292
보다 상당히 큰.10
C996.3.1.1-p2
int가 비트 필드의 너비에 의해 제한된 원래 유형의 모든 값을 나타낼 수 있으면 값이 int로 변환되고, 그렇지 않으면 부호 없는 int로 변환됩니다.이것들을 정수 프로모션이라고 합니다.다른 모든 유형은 정수 프로모션에 의해 변경되지 않습니다.
변환을 수행하는 방법
C99 6.3.1.3-p2
그렇지 않으면 새 유형이 서명되지 않은 경우 값이 새 유형의 범위에 포함될 때까지 새 유형에 표시될 수 있는 최대값보다 하나 더 추가하거나 빼는 작업을 반복하여 값을 변환합니다.
즉, 기본적으로 "UINT_MAX+1 추가"를 의미합니다.
프로모션이 왜 다음과 같았는지에 대해 설명합니다.unsigned int
측면; 우선 순위:
C99 6.3.1.8-p1
...그렇지 않으면 부호 없는 정수 유형을 가진 피연산자의 순위가 다른 피연산자 유형의 순위보다 크거나 같으면 부호 있는 정수 유형을 가진 피연산자가 부호 없는 정수 유형을 가진 피연산자 유형으로 변환됩니다.
그렇지 않으면 부호 있는 정수 유형의 피연산자 유형이 부호 없는 정수 유형의 피연산자 유형의 모든 값을 나타낼 수 있는 경우 부호 없는 정수 유형의 피연산자는 부호 있는 정수 유형의 피연산자 유형으로 변환됩니다.
그 말은int
대.unsigned char
예상대로 작동해야 합니다.
시험
int main()
{
int x = -4;
unsigned int y = 10;
unsigned char z = 10;
if (x > y)
printf("x>y\n");
else
printf("x<y\n");
if (x > z)
printf("x>z\n");
else
printf("x<z\n");
return 0;
}
산출량
x>y
x<z
자, 이것 좀 보세요.
서명된 값과 서명되지 않은 값을 비교하는 작업은 "서명되지 않은 공간"에서 수행됩니다.즉, 다음을 추가하여 서명된 값이 서명되지 않은 값으로 변환됩니다.UINT_MAX + 1
음의 값에 대해 2-보수를 사용하는 구현에서는 후드 아래에서 값을 특별하게 처리할 필요가 없습니다.
이 예에서,-4
로 바뀌었습니다.0x100000000-4
=0xFFFFFFFC
분명한 것은> 10
.
C에서 두 값을 비교할 때 두 값은 모두 같은 유형이어야 합니다.이 경우 (int
그리고.unsigned int
그int
는 값다음변니됩다환로으로 됩니다.unsigned int
없는 + 1 "around" "loop around" 즉, "loop around", C 부 호 의 즉 정 로 연 산 + 1행 "loop around")로 수행됩니다.UINT_MAX + 1
이라0
다시 또는 그 반대).따라서 음수 값을 부호 없는 값으로 변환하면 숫자가 매우 커집니다.
표준의 관련 섹션에는 다음과 같이 나와 있습니다.
6.3.1.3 부호 있는 정수와 부호 없는 정수
2
그렇지 않으면 새 유형이 서명되지 않은 경우 값이 새 유형의 범위에 포함될 때까지 새 유형에 표시될 수 있는 최대값보다 하나 더 추가하거나 빼는 작업을 반복하여 값을 변환합니다.
를 할 때int
리고그.unsigned int
그자리의 int
는 로변됩니다로 됩니다.unsigned int
의 int
완전히unsigned int
는 추면됩니다하가를됩▁adding를 추가하여 수행됩니다.UINT_MAX+1
로 (으)는int
음). 있는 은 다음과 같습니다.따라서 실제로 비교하는 것은 다음과 같습니다.
if (-3 + UINT_MAX > 10) //Since -4 is converted to UINT_MAX+1-4
그건 사실입니다.
int 값의 첫 번째 비트는 양수인지 음수인지 정의하는 데 사용됩니다. (1 = 음수, 0 양수) 두 변수는 비교 전에 부호 없는 int에 캐스팅됩니다. 여기서 첫 번째 비트의 1은 숫자의 일부로 해석됩니다.
이 코드는 잘 작동할 것입니다.
int main(void)
{
unsigned int y = 10;
int x = – 4;
if (x > (int) y)
Printf("x is greater");
else
Printf ("y is greater");
getch ( );
return (0);
}
int x=-4 (2의 보어 4는 11111100 = 252)이고 부호 없는 inty=10은 (0000 1010 = 10)이므로 252 > 10 so -4는 10보다 큽니다.
언급URL : https://stackoverflow.com/questions/13600991/why-is-a-negative-int-greater-than-unsigned-int
'programing' 카테고리의 다른 글
문자열에서 숫자 제거 (0) | 2023.06.17 |
---|---|
변수(개체) 이름을 문자열로 변환하는 방법 (0) | 2023.06.17 |
열의 값으로 데이터 프레임 필터링 (0) | 2023.06.17 |
WooCommerce 체크아웃 페이지에 고객의 팁 입력 추가 (0) | 2023.06.17 |
이것을 Vuex 스토어에서 사용할 수 있습니까? (0) | 2023.06.17 |