C에서 서명되지 않은 int와 서명된 int의 차이점은 무엇입니까?
다음 정의를 고려합니다.
int x=5;
int y=-5;
unsigned int z=5;
메모리에 어떻게 저장됩니까?누가 이것들의 비트 표현을 메모리에 설명할 수 있습니까?
할 수 있다int x=5그리고.int y=-5메모리에 동일한 비트 표현이 있습니까?
ISO C는 차이점이 무엇인지 설명합니다.
그int데이터 형식이 서명되었으며 최소 범위는 -32767 ~ 32767입니다.은 실값은 같습니다과다음제로 됩니다.limits.h~하듯이INT_MIN그리고.INT_MAX각각 다음과 같다.
안 안unsigned int에는 0 ~ , 최대값은 실제최을포함의 0 ~ 65535 최소범입니다.UINT_MAX동일한 헤더 파일에서.
그 외에도, 표준은 값을 인코딩하기 위해 두 개의 보완 표기법을 요구하지 않습니다. 이것은 가능성 중 하나일 뿐입니다.허용되는 세 가지 유형의 인코딩은 5 및 -5(16비트 데이터 유형 사용)에 대해 다음과 같습니다.
two's complement | ones' complement | sign/magnitude
+---------------------+---------------------+---------------------+
5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
+---------------------+---------------------+---------------------+
- 2의 보어에서는 모든 비트를 반전시킨 다음 1을 더하면 숫자의 음수가 됩니다.
- 하나의 보완에서, 당신은 모든 비트를 뒤집음으로써 숫자의 음수를 얻습니다.
- 부호/규모에서 상단 비트는 부호이므로 이를 반전하여 음수를 얻을 수 있습니다.
양수 값은 모든 표현에 대해 동일한 인코딩을 가지며 음수 값만 다릅니다.
부호 없는 값의 경우 부호에 비트 중 하나를 사용할 필요가 없습니다.이는 (물론 부정적인 인코딩을 하지 않는 대신) 긍정적인 측면에서 더 많은 범위를 얻을 수 있다는 것을 의미합니다.
그리고 아니,5그리고.-5사용하는 표현에 관계없이 동일한 인코딩을 가질 수 없습니다.그렇지 않으면, 그 차이를 구별할 방법이 없을 것입니다.
그 외에도, 현재 C와 C++ 표준 모두에서 2의 보어를 음의 정수에 대한 유일한 인코딩으로 지정하려는 움직임이 진행 중입니다.
모든 것이 메모리에 관한 것이기 때문에, 결국 모든 수치는 이진법으로 저장됩니다.
32비트 부호 없는 정수는 모든 이진 0부터 모든 이진 1까지의 값을 포함할 수 있습니다.
32비트 부호 정수의 경우 비트 중 하나(가장 중요)가 양 또는 음으로 표시되는 플래그임을 의미합니다.
C 표준은 부호 없는 숫자가 이진수로 저장되도록 지정합니다(옵션 패딩 비트 포함).부호 있는 숫자는 크기와 부호, 2의 보어 또는 1의 보어의 세 가지 형식 중 하나로 저장할 수 있습니다.흥미롭게도 그것은 초과-n 또는 기저-2와 같은 특정한 다른 표현을 배제합니다.
그러나 대부분의 컴퓨터와 컴파일러에서는 부호 있는 숫자를 2의 보어로 저장합니다.
int일반적으로 16비트 또는 32비트입니다.기준에 따르면int기본 프로세서에 가장 효율적인 것이어야 합니다.>= short그리고.<= long기준에 따라 허용됩니다.
일부 시스템 및 OS에서는 기록이 원인이 됩니다.int그러나 하드웨어의 현재 반복에 가장 적합한 크기는 아닙니다.
여기 C에서 서명된 INT와 서명되지 않은 INT의 저장을 설명하는 매우 멋진 링크가 있습니다.
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
위의 기사에서 발췌한 -
"2의 보체라고 불리는 과정은 양수를 음수로 변환하는 데 사용됩니다.이로 인해 발생하는 부작용은 가장 중요한 비트가 숫자가 양수인지 음수인지 컴퓨터에 알려주는 데 사용된다는 것입니다.가장 유의한 비트가 1이면 숫자는 음수입니다.0이면 양수입니다."
int가 16비트 정수(C 구현에 따라 다르며, 현재는 대부분 32비트임)라고 가정할 때 비트 표현은 다음과 같이 다릅니다.
5 = 0000000000000101
-5 = 1111111111111011
이진 11111111111111011이 부호 없는 int로 설정되면 소수점 65531이 됩니다.
언급URL : https://stackoverflow.com/questions/3812022/what-is-a-difference-between-unsigned-int-and-signed-int-in-c
'programing' 카테고리의 다른 글
| tslint.json 구성에 포함할 항목은 무엇입니까? (0) | 2023.06.18 |
|---|---|
| 참조 커서를 반환하는 오라클 프로시저에서 적절한 형식의 결과를 얻는 방법은 무엇입니까? (0) | 2023.06.18 |
| Angular 2의 JSON 파이프가 작동하지 않습니다. (0) | 2023.06.18 |
| cocoapods 버전 1.0.0.beta.1에 오류가 표시되는 포드 설치 (0) | 2023.06.18 |
| Python Panda는 한 열의 NaN을 두 번째 열의 해당 행 값으로 바꿉니다. (0) | 2023.06.18 |