programing

UINT_MAX는 모든 비트가 1로 설정되어 있습니까?

testmans 2023. 10. 17. 20:07
반응형

UINT_MAX는 모든 비트가 1로 설정되어 있습니까?

이 질문은 전에 했던 것인데 저는 여전히 혼란스럽습니다.

나는 그것을 알고 있습니다.

unsigned int a = -1;

되지요UINT_MAX. 그러나 -1의 모든 비트가 설정되어 있기 때문은 아닙니다.C11은 말합니다.

new type이 부호가 없는 경우 값이 new type의 범위에 들어갈 때까지 new type에서 나타낼 수 있는 최대값보다 하나를 더 많이 반복적으로 가감함으로써 값이 변환됩니다.

그래서 이렇게 하자구요.UINT_MAX는 100입니다. (2^16-1보다 커야 한다는 것을 알고 있지만 이는 일단 무시합니다.)

unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX  

표준에는 다음과 같이만 표시됩니다.UINT_MAX >= 2^16-1. 하지만 어디든 2^n-1이 되어야 한다고 쓰여 있나요?

C++에서도 답이 다릅니까?

C에서 부호 없는 정수의 최대값은 2 - 1 형식이어야1N 합니다.

따라서 UINT_MAX 값의 모든 값 비트가 1로 설정됩니다.값이 지정되지 않은 패딩 비트가 있을 수 있습니다.


1 (인용: ISO/IEC 9899:201x6.2.6.2 정수형 1)
부호 없는 문자 이외의 부호 없는 정수 형식의 경우 객체 표현의 비트는 값 비트와 패딩 비트의 두 그룹으로 나뉩니다(후단은 필요 없음).N개의 값 비트가 있는 경우 각 비트는 1과 2N−1 사이의 2의 서로 다른 거듭제곱을 나타내야 하며, 따라서 해당 유형의 객체는 순수 이진 표현을 사용하여 0에서 2-1N 사이의 값을 나타낼 수 있어야 합니다. 이를 값 표현이라고 합니다.패딩 비트의 값은 지정되지 않습니다.

아니, 그렇지는 않아.

부호 없는 유형은 값 비트패딩 비트로 구성될 수 있습니다.

최대값의 경우 값 비트가 항상 1로 설정되는 것은 맞지만 패딩 비트의 특정 값은 구현에 맡깁니다.따라서 UINT_MAX는 메르센 번호여야 합니다.다른 요구사항에는 65535 미만일 수 없다고 명시되어 있습니다.

이 점에서 C와 C++는 동치입니다.

변환의 정의에 의해 부호 없는 int로 변환된 -1은 UINT_MAX로 보장된다고 하는 것이 맞습니다.비트 패턴과는 상관이 없습니다.만약 UINT_MAX가 100인 구현이 있다면, 부호 없는 int로 변환된 -1은 100이 될 것입니다.

UINT_MAX가 100이 될 수 없는 이유가 있습니다. 하나는 ≥ 2^16-1이어야 하기 때문입니다. 하지만 이는 UINT_MAX = 1,000,000을 허용합니다.둘째, 부호 없는 int에는 값 비트의 개수가 n개인 이진법 표현이 있어야 하므로 UINT_MAX = 2^n - 1입니다.

INT_MAX = 2^31 - 1 및 UINT_MAX = 2^31 - 1(통상처럼 2^32 - 1이 아님)이 가능합니다.이 경우 -1은 32비트로 설정됩니다. -1은 부호 없는 int로 캐스트되며 2^31 - 1이며 31비트만 설정됩니다.

언급URL : https://stackoverflow.com/questions/42297434/does-uint-max-have-all-bits-set-to-1

반응형