부호있는 정수와 부호없는 정수


395

부호있는 정수와 부호없는 정수의 차이점은 다음과 같습니다.

  1. 부호없는 값은 더 큰 양수 값을 보유 할 수 있으며 음수 값을 보유 할 수 없습니다.
  2. 부호 없음은 값의 일부로 선행 비트를 사용하는 반면 부호있는 버전은 가장 왼쪽 비트를 사용하여 숫자가 양수인지 음수인지 식별합니다.
  3. 부호있는 정수는 양수와 음수를 모두 보유 할 수 있습니다.

다른 차이점이 있습니까?


6
0이 양수 또는 음수가 아니기 때문에 부호없는 정수 에 양수 값 대신 음이 아닌 값 이라는 용어를 사용하는 것이 더 적합합니다 .
Daniel

답변:


344

부호없는 값은 더 큰 양수 값을 보유 할 수 있으며 음수 값을 보유 할 수 없습니다.

예.

부호 없음은 값의 일부로 선행 비트를 사용하는 반면 부호있는 버전은 가장 왼쪽 비트를 사용하여 숫자가 양수인지 음수인지 식별합니다.

부호있는 정수를 나타내는 여러 가지 방법이 있습니다. 시각화하는 가장 쉬운 방법은 가장 왼쪽 비트를 플래그 ( 부호 및 크기 )로 사용하는 것이지만, 일반적으로 2의 보수 입니다. 둘 다 대부분의 최신 마이크로 프로세서에서 사용됩니다. 부동 소수점은 부호와 크기를 사용하고 정수 산술은 2의 보수를 사용합니다.

부호있는 정수는 양수와 음수를 모두 보유 할 수 있습니다.


이것이 정확히 그 텍스트인지 확실하지 않지만 다른 링크를 찾았습니다. PDF의 9 번째 페이지 (실제로는 책의 38 번째 페이지)로 이동하면 데이터 표현 (섹션 1.3) 섹션을 볼 수 있습니다. 그것은 위에서 말한 모든 것들에 대한 설명이 있습니다. lms.uop.edu.jo/lms/pluginfile.php/2420/mod_resource/content/1/…
WeirdElfB0y

92

x86에서 하드웨어 수준의 차이점을 살펴 보겠습니다. 컴파일러를 작성하거나 어셈블리 언어를 사용하지 않는 한 이것은 대부분 관련이 없습니다. 그러나 알아두면 좋습니다.

첫째, x86은 부호있는 숫자 의 2의 보수 표현을 기본적으로 지원 합니다. 다른 표현을 사용할 수 있지만 더 많은 지시가 필요하며 일반적으로 프로세서 시간을 낭비합니다.

"기본 지원"이란 무엇입니까? 기본적으로 나는 부호없는 숫자에 사용되는 명령어 세트와 부호있는 숫자에 사용하는 다른 세트가 있음을 의미합니다. 부호없는 숫자는 부호있는 숫자와 동일한 레지스터에있을 수 있으며 실제로 프로세서를 걱정하지 않고 부호있는 명령어와 부호없는 명령어를 혼합 할 수 있습니다. 숫자의 서명 여부를 추적하고 적절한 지침을 사용하는 것은 컴파일러 (또는 어셈블리 프로그래머)의 책임입니다.

첫째, 2의 보수 숫자는 덧셈과 뺄셈이 부호없는 숫자와 동일하다는 특성을 가지고 있습니다. 숫자가 양수인지 음수인지는 차이가 없습니다. (그냥 가서 그래서 ADD하고 SUB걱정없이 숫자.)

비교할 때 차이점이 보이기 시작합니다. x86은 그것들을 구별하는 간단한 방법을 가지고 있습니다 : 위 / 아래는 부호없는 비교를 나타내며 부호있는 비교를 나타내는 것보다 크거나 작습니다. (예 : JAE"위의 경우 점프"를 의미하며 부호가 없습니다.)

부호있는 정수와 부호없는 정수를 처리하기위한 곱셈 및 나눗셈 명령어 세트도 있습니다.

마지막으로 오버플로를 확인하려면 부호있는 숫자와 부호없는 숫자에 대해 다르게 수행하십시오.


부호없는 숫자와 부호있는 숫자가 무엇을 의미합니까, 내가 묻고 싶은 것은 부호없는 int a = 2 및 부호있는 int b = 2을 쓰면 부호가 있거나 부호가없는, 부호가 있거나 부호가없는 숫자는 유형에 따라 다릅니다 우리는 그것을 할당하거나, 그것이 음의 부호를 가지고 있는지 아닌지에 달려 있습니까? 이것은 잠시 동안 나를 괴롭 혔습니다.
Suraj Jain

@SurajJain 부호부호 없음 은 유형을 나타냅니다. 변수 또는 표현식이 음수 값을 가질 있는지 여부를 나타냅니다 .
Artelius

나는 다음과 같은 의심, 난, 여기 좀 봐, 아직 문제없이 만족스러운 답변을 요구 한 한 stackoverflow.com/questions/41399092/...
SURAJ 자이나교

62

그는 서명 및 서명되지 않은 것에 대해서만 물었습니다. 사람들이 왜 이것에 여분의 것을 추가하는지 모르겠다. 답을 말씀 드리겠습니다.

  1. 부호 없음 : 음이 아닌 값 (0-255)으로 만 구성됩니다.

  2. 부호 : 음수 값과 양수 값으로 구성되지만

    • 0에서 +127
    • -1에서 -128

그리고이 설명은 8 비트 숫자 시스템에 관한 것입니다.


17

완전성을위한 몇 가지 요점 :

  • 이 답변은 정수 표현에 대해서만 논의합니다. 부동 소수점에 대한 다른 답변이있을 수 있습니다.

  • 음수의 표현은 다를 수 있습니다. (지금까지 - 오늘 거의 보편적이다) 가장 일반적으로 오늘날 사용은 2의 보수 . 다른 표현으로는 하나의 보수 (quite rare)와 부호가있는 크기 (vanishly rare-아마도 박물관 조각에만 사용됨)가 있습니다. 이것은 단순히 비트를 숫자의 절대 값을 나타내는 나머지 비트와 함께 부호 표시기로 사용합니다.

  • 2의 보수를 사용할 때 변수는 양수보다 음수의 더 큰 범위 (1 씩)를 나타낼 수 있습니다. 이는 부호 비트가 0으로 설정되지 않았기 때문에 '양수'숫자에는 0이 포함되지만 음수는 아니기 때문입니다. 이것은 가장 작은 음수의 절대 값을 표현할 수 없음을 의미합니다.

  • 1의 보수 또는 부호있는 크기를 사용하는 경우 0을 양수 또는 음수로 나타낼 수 있습니다 (이러한 표현이 일반적으로 사용되지 않는 몇 가지 이유 중 하나임).


부호없는 int a = -2를 쓰고 부호있는 int b = -2를 쓰면 기본 표현이 같을 것입니다. 음수 값이 주어지면 부호없는 숫자를 갖는 것이 좋지 않다는 것을 알고 있습니다. 기본 표현?
Suraj Jain

1
사소한 문제 : IEEE 부동 소수점에서 부호와 크기가 사용되므로 실제로 매우 일반적입니다. :-)
alastair

14

우리가 수업 시간에 배운 내용에 따르면, 부호있는 정수는 모두 긍정적 나타낼 수 부호없는 정수가있는 동안, 음수 에만 음수가 아닌.

예를 들어, 8 비트 숫자를 보면 :

부호없는0255

부호있는 값의 범위는 -128~127


11

포인트 2를 제외한 모든 것이 정확합니다. 부호있는 정수에 대한 여러 가지 표기법이 있으며 일부 구현은 첫 번째 구현을 사용하고 다른 구현은 마지막을 사용하고 다른 구현은 완전히 다른 것을 사용합니다. 모든 것은 작업중인 플랫폼에 따라 다릅니다.


리틀 엔디안과 빅 엔디안인가요?
vIceBerg

little vs. big endian은 플랫폼의 바이트 순서와 관련이 있습니다. 리틀 엔디안은 0xFF 0xFE 0x7F를 수행하지만 빅 엔디안은 0x7F 0xFE 0xFF를 수행합니다.
Jasper Bekkers

10

다른 크기는 다른 크기의 정수를 변환 할 때입니다.

예를 들어, 부호없는 값을 사용하여 바이트 스트림에서 정수 (예 : 단순화를 위해 16 비트)를 추출하는 경우 다음을 수행 할 수 있습니다.

i = ((int) b[j]) << 8 | b[j+1]

(해야 아마 2 캐스트 바이트,하지만 난 컴파일러가 옳은 일을 할 것 같은데요)

부호있는 값을 사용하면 부호 확장에 대해 걱정하고 다음을 수행해야합니다.

i = (((int) b[i]) & 0xFF) << 8 | ((int) b[i+1]) & 0xFF

5

일반적으로 말하면 맞습니다. 왜 당신이 차이점을 찾고 있는지에 대해 더 이상 알지 못하면 서명 된 것과 서명되지 않은 다른 차별화 요소를 생각할 수 없습니다.


4

다른 사람들이 말한 것 이상으로 C에서는 부호없는 정수를 오버플로 할 수 없습니다. 동작은 모듈러스 산술로 정의됩니다. 부호있는 정수를 오버플로 할 수 있으며 이론 상으로는 (현재 주류 시스템에서는 실제로는 아니지만) 오버플로로 인해 오류가 발생할 수 있습니다 (아마도 0으로 나누기 오류와 유사).


1
부호있는 정수 오버 플로우는 정의되지 않은 동작을 트리거하며, 현대 컴파일러는이를 발견하고 예상치 못한 기술적으로 합법적 인 방식으로 프로그램을 수정하기 위해 공격적으로 접근합니다. 이것은 7 년 전보다 훨씬 더 많은 문제입니다.
Jonathan Leffler

4
  1. 예, 부호없는 정수는 큰 값을 저장할 수 있습니다.
  2. 아니요, 양수 값과 음수 값을 표시하는 다른 방법이 있습니다.
  3. 예, 부호있는 정수는 양수 값과 음수 값을 모두 포함 할 수 있습니다.

4

(두 번째 질문에 대한 답변) 부호 비트 (2의 보수는 아님) 만 사용하면 -0으로 끝날 수 있습니다. 별로 예쁘지 않습니다.


이 답변에 추가하기 만하면 기본적으로 10 == 00이며 두 숫자가 모두 기본 2입니다.

4

C의 부호있는 정수는 숫자를 나타냅니다. 경우 ab유형 부호있는 정수의 변수, 표준은 컴파일러가 표현 할 것을 요구하지 않습니다 a+=b에 저장소를 a각각의 값의 산술 합 이외. 확실하게 산술 합이에 맞지 않으면 a프로세서 그것을 넣을 수는 없지만 표준은 컴파일러가 값을 자르거나 줄 바꿈하거나 값을 초과하는 경우 그 문제에 대해 다른 것을 요구하지 않습니다 그들의 유형에 대한 한계. 표준에는 필요하지 않지만 C 구현에서는 부호있는 값으로 산술 오버플로를 트랩 할 수 있습니다.

C에서 부호없는 정수는 더 큰 유형으로 변환하거나 연산하는 시나리오를 제외하고는 2의 거듭 제곱 인 합동 정수의 추상 대수 고리로 동작합니다. 임의의 크기 의 정수를 32 비트 부호없는 유형으로 변환하면 해당 정수 mod 4,294,967,296에 해당하는 항목에 해당하는 멤버가 생성됩니다. 3을 2에서 빼는 이유 4,294,967,295는 3에 합한 것을 4,294,967,295에 합한 것에 더하면 2에 합당한 것을 산출하기 때문입니다.

추상 대수 고리 유형은 종종 유용한 것들입니다. 불행히도 C는 형식이 링으로 작동해야하는지 여부를 결정하는 요소로 부호를 사용합니다. 더 나쁜 것은 부호없는 값은 더 큰 유형으로 변환 될 때 링 멤버가 아니라 숫자로 처리되고, 부호없는 값은 int산술이 수행 될 때 숫자로 변환되는 것보다 작 습니다. 경우 vA는 uint32_t같아지는 4,294,967,294다음 v*=v;확인해야합니다 v=4. 불행히도 int64 비트라면 무엇을 v*=v;할 수 있는지 말하지 않습니다.

표준을 그대로 감안할 때 대수 고리와 관련된 동작을 원하는 상황에서 부호없는 유형을 사용하고 숫자를 나타내려면 부호있는 유형을 사용하는 것이 좋습니다. 불행히도 C가 그랬던 것처럼 차별화를 이끌어 냈지만, 그것이 바로 그런 것입니다.


3

부호없는 정수는 부호있는 정수보다 특정 트랩에서 당신을 잡을 가능성이 훨씬 큽니다. 함정은 위의 1 & 3은 정확하지만 두 유형의 정수 모두 "보유"할 수있는 범위를 벗어나는 값을 할당 할 수 있으며 자동으로 변환됩니다.

unsigned int ui = -1;
signed int si = -1;

if (ui < 0) {
    printf("unsigned < 0\n");
}
if (si < 0) {
    printf("signed < 0\n");
}
if (ui == si) {
    printf("%d == %d\n", ui, si);
    printf("%ud == %ud\n", ui, si);
}

이 값을 실행하면 두 값이 모두 -1에 할당되고 다르게 선언 된 경우에도 다음과 같은 결과가 나타납니다.

signed < 0
-1 == -1
4294967295d == 4294967295d

0

유일한 보장 차이 서명 및 C의 부호 값은 부호가없는 캔 단지 0 또는 양수가 될 때 상기 서명 값은 음수, 양수 또는 0이 될 수 있다는 것이다. 문제는 C가 형식의 형식을 정의하지 않기 때문에 정수가 2의 보수 인지 알 수 없다는 입니다. 언급 한 처음 두 가지 점을 엄격히 말하면 정확하지 않습니다.


0

임베디드 시스템에서 프로그래밍 할 때는 부호없는 정수를 사용해야합니다. 루프에서 부호있는 정수가 필요하지 않은 경우 부호없는 정수를 사용하면 그러한 시스템을 설계하는 데 필요한 안전이 절약됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.