부호있는 정수와 부호없는 정수의 차이점은 무엇입니까?


91

부호있는 정수와 부호없는 정수의 차이점은 무엇입니까?


5
이것은 진짜 질문이고 대답은 그렇게 간단하지 않고 오히려 미묘합니다.
— R .. GitHub의 STOP 돕기 ICE

재 개설 투표. 중복 일 수도 있지만 확실히 진짜 질문입니다.
— Brian


많은 언어에서 태그를 사용하므로 더 많은 태그를 추가해야합니다.
— Juan Boero

이 질문을 자세히 설명하려면 장이 필요할 수 있습니다. 인과 아웃을 알고 싶다면 Unsigned 및 Signed Integers 에서 자세한 설명을 확인하십시오 .
— 익명의

답변:


113

아시다시피 ints는 내부적으로 바이너리에 저장됩니다. 일반적으로 int에는 32 비트가 포함되지만 일부 환경에서는 16 비트 또는 64 비트 (또는 다른 숫자, 일반적으로 2의 거듭 제곱 일 필요는 없음)를 포함 할 수 있습니다.

그러나이 예에서는 4 비트 정수를 살펴 보겠습니다. 작지만 설명 목적으로 유용합니다.

이러한 정수에는 4 비트가 있으므로 16 개의 값 중 하나를 가정 할 수 있습니다. 16은 2의 4 제곱 또는 2 x 2 x 2 x 2입니다.이 값은 무엇입니까? 답은이 정수가 있는지 여부에 따라 signed int또는를 unsigned int. 를 사용하면 unsigned int값은 절대 음수가 아닙니다. 값과 관련된 부호가 없습니다. 다음은 4 비트의 16 가지 가능한 값입니다 unsigned int.

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

... 그리고 다음은 4 비트의 16 가지 가능한 값입니다 signed int.

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000   -8
1001   -7
1010   -6
1011   -5
1100   -4
1101   -3
1110   -2
1111   -1

보시다시피 signed ints의 1경우 최상위 비트는 숫자가 음수 인 경우에만 해당됩니다. 이것이 signed ints의 경우이 비트를 "부호 비트"라고하는 이유 입니다.


11
지적 할 가치가있는 것은 이것이 오늘날 널리 사용되는 2의 보수 형식이라는 것입니다. 부호있는 정수, 특히 1의 보수를 나타내는 다른 방법도 있습니다.
— Schedler 2011

옳은. 그리고 ISO9899 C 표준은 1의 보수 또는 2의 보수를 사용할 필요조차 없습니다. 실제로 작동하는 다른 모든 규칙은 허용됩니다.
— Mariposa의 Bill Evans 2011

1
2의 보수가 필요하지는 않지만는 (이진 표현과 무관)에 (unsigned)(-1)대한 최대 표현 가능 값이어야하며 unsigned, 2의 보수에 대해서는 사실이지만 다른 표현에는 적용되지 않습니다.
— rubenvb

3
@BillEvansatMariposa : 표준에 따르면 부호있는 정수에는 부호 + 크기, 2의 보수, 1의 보수의 세 가지 표현이 허용됩니다. 다른 사람은 프로그램에 표시되지
— 않고이

좋아,하지만 후드 아래! 정말 무슨 일이 일어나고 있습니까! 서명 된 숫자와 서명되지 않은 숫자의 차이점은 무엇입니까? 기계는 계산을 어떻게 관리합니까? 다른 값에서 값을 뺍니다. 1111 = 15와 1111 = -1의 차이점은 무엇입니까?
— Mihail Georgescu

19

int그리고 unsigned int두 가지 정수 타입이다. ( int이라고도 할 수 signed int또는 단지 signed; unsigned int이라고도 할 수있다 unsigned).

이름에서 알 수 있듯이, intA는 서명 정수 유형 및 unsigned int입니다 부호없는 정수 타입. 즉 int, 음수 값을 나타낼 unsigned int수 있으며 음수가 아닌 값만 나타낼 수 있습니다.

C 언어는 이러한 유형의 범위에 몇 가지 요구 사항을 부과합니다. 범위는 .. int이상이어야 하고 범위는 .. 이상이어야합니다 . 이는 두 유형 모두 최소 16 비트 여야 함을 의미합니다. 많은 시스템에서 32 비트이거나 일부에서는 64 비트입니다. 일반적으로 대부분의 최신 시스템에서 사용되는 2의 보수 표현으로 인해 추가 음수 값이 있습니다.-32767+32767unsigned int065535int

아마도 가장 중요한 차이점은 부호있는 산술과 부호없는 산술의 동작입니다. signed의 int경우 오버플로에 정의되지 않은 동작이 있습니다. 의 경우 unsigned int오버플로가 없습니다. 유형의 범위를 벗어난 값을 생성하는 모든 작업은 래핑됩니다 UINT_MAX + 1U == 0U.

부호있는 또는 부호없는 모든 정수 유형은 무한한 수학적 정수 집합의 하위 범위를 모델링합니다. 유형의 범위 내에서 값으로 작업하는 한 모든 것이 작동합니다. 유형의 하한 또는 상한에 접근하면 불연속이 발생하고 예기치 않은 결과가 발생할 수 있습니다. 유형 부호있는 정수의 경우, 문제는 매우 큰 음과 양의 값을 초과하는 경우에만 발생 INT_MIN하고 INT_MAX. 부호없는 정수 유형의 경우 매우 큰 양수 값 과 0에서 문제가 발생 합니다 . 이것은 버그의 원인이 될 수 있습니다. 예를 들어, 이것은 무한 루프입니다.

for (unsigned int i = 10; i >= 0; i --) [
    printf("%u\n", i);
}

i는 항상 0보다 크거나 같기 때문 입니다 . 이것이 서명되지 않은 유형의 특성입니다. (루프 내부에서 값 i이 0이면 i--값을로 설정합니다 UINT_MAX.)


12

때때로 우리는 주어진 정수 변수에 저장된 값이 항상 양수라는 것을 미리 알고 있습니다. 이 경우 변수를 unsigned로 선언 할 수 있습니다.unsigned int num student; . 이러한 선언을 사용하면 허용되는 정수 값 (32 비트 컴파일러의 경우) 범위가 -2147483648에서 +2147483647 범위에서 0에서 4294967295 범위로 이동합니다. 따라서 정수를 부호없는 것으로 선언하면 가능한 가장 큰 값의 크기가 거의 두 배가됩니다. 그렇지 않으면 보유 할 수있는 가치.


@Alex 나는 10 분 전에 대답을 편집하는 중이었고 동일합니다. lol
— Skuld

12

평신도의 용어로 unsigned int는 음수가 될 수없는 정수이므로 가정 할 수있는 양의 값 범위가 더 큽니다. 부호있는 int는 음수 일 수 있지만 더 많은 음수 값을 가정 할 수있는 대가로 더 낮은 양수 범위를 갖는 정수입니다.


0

실제로 두 가지 차이점이 있습니다.

  1. 인쇄 (예 : coutC ++ 또는 printfC) : 부호없는 정수 비트 표현은 인쇄 함수에 의해 음이 아닌 정수로 해석됩니다.
  2. ordering : 순서는 서명되거나 서명되지 않은 사양에 따라 다릅니다.

이 코드는 순서 기준을 사용하여 정수를 식별 할 수 있습니다.

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

이것이 하나는 음수를 다루고 다른 하나는 다르게 설명한다면 그렇지 않습니다. 이 게시물에 많은 도움이 될 것입니다.
— Daniel Jackson

@DanielJackson 당신이 말하는 것을 명확하지 않습니다. 문자는 컴파일러에 따라 음수 또는 양수로 간주 될 수 있습니다. 코드의 출력은 컴파일러가 선택한 항목에 따라 다르며 이것은 부호있는 것과 부호없는 것의 차이를 보여줍니다.
— 최연소 Heximus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.