서명되지 않은 int 0xFFFFFFFF가 int -1과 같은 이유는 무엇입니까?
C 또는 C++에서 a size_t(부호화되지 않은 int 데이터 유형)가 보유할 수 있는 최대 수는 해당 데이터 유형에 -1을 주조하는 것과 동일하다고 합니다.예를 들어 size_t에 대한 잘못된 값을 참조하십시오.
왜요?
즉, (32비트 int에 대해 이야기함) AFAIK에서 가장 의미 있는 비트는 부호화된 데이터 유형(즉, 음수를 형성하기 위해 비트 0x800000)으로 부호를 유지합니다.그러면 1은 0x00000001..0x7FFFFFFFF는 데이터 유형이 보유할 수 있는 최대 양수입니다.
그렇다면 AFAIK는 -1 int의 이진법 표현이 0x80000001이어야 합니다(아마도 제가 틀렸을 것입니다).int를 비부호로 주조할 때 이 이진값이 완전히 다른 값(0xFFFFFF)으로 변환되는 이유는 무엇입니까?아니면.. 어떻게 0xFFFFFF 중에서 이진 -1을 형성할 수 있습니까?
C: ((부호 없는 int)-1) == 0xFFFFFF 또는 (int)0xFFFFFF) == -1이 1 + 1 == 2와 동일하게 참이라는 것을 확신합니다. 이유가 궁금합니다.
C와 C++는 다양한 아키텍처 및 머신 유형에서 실행할 수 있습니다.결과적으로, 그들은 다양한 숫자의 표현을 가질 수 있습니다:둘의 보어와 하나의 보어가 가장 일반적입니다.일반적으로 프로그램의 특정 표현에 의존해서는 안 됩니다.
부호 없는 정수 유형의 경우(size_t
그 중 하나), C 표준(그리고 C++ 표준도)은 정확한 오버플로우 규칙을 지정합니다.간단히 말하면, 만약에SIZE_MAX
는 유형의 최대값입니다.size_t
, 그다음에 그 표현
(size_t) (SIZE_MAX + 1)
는 것이 확실합니다.0
, 그러므로, 당신은 확신할 수 있습니다.(size_t) -1
와 같음SIZE_MAX
. 서명되지 않은 다른 유형에서도 마찬가지입니다.
위의 내용은 사실입니다.
- 서명되지 않은 모든 유형에 대해
- 기본 기계가 Two의 보어에 숫자를 나타내지 않더라도 말입니다.이 경우 컴파일러는 ID가 참인지 확인해야 합니다.
또한, 위의 내용은 서명된 유형에 대해 특정 표현에 의존할 수 없다는 것을 의미합니다.
편집: 의견 중 일부에 답하기 위해:
다음과 같은 코드 스니펫이 있다고 가정해 보겠습니다.
int i = -1;
long j = i;
할당에 형식 변환이 있습니다.j
. 가정하에int
그리고.long
크기가 다릅니다(대부분의 [모든] 64비트 시스템). 메모리 위치의 비트 patterns:i
그리고.j
크기가 다르기 때문에 달라질 것입니다.컴파일러는 다음의 값을 확인합니다.i
그리고.j
이다-1
.
마찬가지로, 우리가 할 때:
size_t s = (size_t) -1
유형 변환이 진행되고 있습니다.-1
유형의int
. 비트 패턴이 있지만 이 예에서는 무관합니다. 왜냐하면 다음으로 변환할 때.size_t
캐스트로 인해 발생하며, 컴파일러는 유형에 대한 규칙에 따라 값을 변환합니다 (size_t
이 경우).따라서 설령int
그리고.size_t
다른 크기를 갖습니다. 표준은 저장된 값을 보장합니다.s
위의 값은 다음과 같은 최대 값이 될 것입니다.size_t
가져갈 수 있습니다.
할 경우:
long j = LONG_MAX;
int i = j;
한다면LONG_MAX
보다 큼INT_MAX
, 그 다음의 값.i
는 구현에 정의되어 있습니다(C89, 섹션 3.2.1.2).
2의 보체라고 합니다.음수를 만들려면 모든 비트를 반전시킨 다음 1을 더합니다.따라서 1을 -1로 변환하려면 0xFFFFFFFFE로 반전시킨 후 1을 더하면 0xFFFFF가 됩니다.
왜 이런 방식으로 이루어지는지에 대해 위키피디아는 다음과 같이 말합니다.
이 둘의 보체계는 덧셈과 뺄셈 회로가 피연산자들의 부호를 검사하여 덧셈과 뺄셈을 결정할 필요가 없다는 장점이 있습니다.이 특성을 통해 시스템 구현이 더 간단해지고 정밀도 높은 연산을 쉽게 처리할 수 있습니다.
당신의 첫번째 질문은 왜?(unsigned)-1
가능한 최대의 부호 없는 값은 2의 보어와 우연히 관련이 있을 뿐입니다.부호가 없는 유형에 -1 캐스트가 가능한 가장 큰 값을 제공하는 이유는 표준에서 부호가 없는 유형이 "산술 모듈로 2의n 법칙을 따른다(n은 해당 정수 크기의 값 표현에 포함된 비트 수)"고 명시하기 때문입니다.
이제 2의 보어에 대해 가능한 가장 큰 부호 없는 값과 -1의 표현은 동일하지만 하드웨어가 다른 표현(예: 1의 보어 또는 부호/크기)을 사용하더라도 -1을 부호 없는 유형으로 변환하면 해당 유형에 대해 가능한 가장 큰 값이 생성됩니다.
2의 보어는 덧셈과 같이 뺄셈을 하기에 매우 좋습니다 :)
11111110(254 또는 -2)+00000001 ( 1)---------11111111(255 또는 -1)11111111(255 또는 -1)+00000001 ( 1)---------100000000 ( 0 + 256)
저것은 둘의 보어 부호화입니다.
주요 이점은 서명되지 않은 int를 사용하든 서명되지 않은 int를 사용하든 동일한 인코딩을 얻을 수 있다는 것입니다.0에서 1을 빼면 정수는 간단히 둘러싸입니다.따라서 0보다 작은 1은 0xFFFFFF입니다.
int -1에 대한 비트 패턴이 16진수 unsigned의 FFFFFF이기 때문입니다. 1111111111111111111111111111111111111111 바이너리 unsigned.그러나 첫 번째 비트는 부정적인지 여부를 나타냅니다.그러나 서명되지 않은 첫 번째 비트에서는 서명되지 않은 int가 음수가 될 수 없기 때문에 여분의 숫자일 뿐입니다.그래서 여분의 비트는 서명되지 않은 무형을 더 큰 숫자를 저장할 수 있게 만듭니다.서명되지 않은 11111111111111111111111111111111111111111111(이진형) 또는 FFFFFFFFF1111111111111111(16진수)은 유인이 저장할 수 있는 가장 큰 숫자입니다.서명되지 않은 Ints는 음이 되면 오버플로되어 가장 많은 int로 가기 때문에 권장되지 않습니다.
언급URL : https://stackoverflow.com/questions/1863153/why-unsigned-int-0xffffffff-is-equal-to-int-1
'programing' 카테고리의 다른 글
텍스트가 넘치지 않고 다음 줄에 나타나도록 하려면 어떻게 해야 합니까? (0) | 2023.11.06 |
---|---|
스크롤할 때 메뉴 바를 상단에 고정한 채로 둡니다. (0) | 2023.11.06 |
워드프레스에서 분류법 또는 사용자 정의 필드를 동시에 조회하려면 어떻게 해야 합니까? (0) | 2023.11.06 |
jQuery에서 Grep vs 필터? (0) | 2023.11.06 |
mysql에서 구별되는 2개의 열 조합 선택 (0) | 2023.11.06 |