UFO ET IT

uint8_t ≠ unsigned char은 언제입니까?

ufoet 2020. 12. 12. 11:53
반응형

uint8_t ≠ unsigned char은 언제입니까?


C 및 C ++에 따르면 CHAR_BIT >= 8.
그러나 CHAR_BIT > 8, uint8_t는 8 비트로 표현할 수도 없습니다. 시스템의 모든 데이터 유형에 대한 최소 비트 수
이므로 더 커야 CHAR_BIT합니다.

어떤 종류의 시스템 uint8_t이 합법적으로 다른 유형으로 정의 될 수 unsigned char있습니까?

(C와 C ++에 대한 대답이 다른 경우 둘 다 알고 싶습니다.)


존재하는 경우 uint8_t항상 너비가 unsigned char. 그러나 동일한 유형일 필요는 없습니다. 별개의 확장 정수 유형일 수 있습니다. 또한 다음과 같은 표현을 가질 필요는 없습니다 unsigned char. 예를 들어, 비트는 반대 순서로 해석 될 수 있습니다. 이 바보 같은 예이지만 것이 더 의미가 int8_t어디에 signed char있는 동안 사람이 보완 또는 로그인 크기 수도 int8_t의 보수 할 필요가있다.

uint8_t"일반"시스템에서도 문자가 아닌 확장 정수 유형을 사용하는 또 다른 "장점" 은 C의 별칭 규칙입니다. 문자 유형은 모든 별칭을 사용할 수 있으므로 restrict키워드가 제대로 적용 되지 않은 경우 컴파일러가 문자 포인터와 다른 유형에 대한 포인터를 모두 사용하는 함수를 크게 최적화하지 못합니다. uint8_t그러나과 정확히 동일한 크기와 표현을 가지고 있어도 unsigned char구현에서 문자가 아닌 고유 한 유형으로 만들면 별칭 규칙이 적용되지 않으며 컴파일러는 uint8_t유형의 객체 int가 별칭은 없습니다.


어떤 종류의 시스템 uint8_t이 합법적으로 다른 유형으로 정의 될 수 unsigned char있습니까?

요약하면, 8 인 uint8_t시스템에서만 합법적으로 정의 될 수 있습니다. CHAR_BIT이는 정확히 8 개의 값 비트와 패딩 비트가없는 주소 지정이 가능한 단위입니다.

자세하게 CHAR_BIT는 가장 작은 주소 지정 단위의 너비를 정의하며 uint8_t패딩 비트를 가질 수 없습니다. 주소 지정 가능한 가장 작은 단위가 정확히 8 비트 너비 인 경우에만 존재할 수 있습니다. 제공 CHAR_BIT은 8이며, uint8_t패딩 비트가없는 8 비트 부호없는 정수 유형에 대한 유형 정의로 정의 할 수 있습니다.


다음은 C11 표준 초안 (n1570.pdf)의 내용입니다.

5.2.4.2.1 정수 유형의 크기 1 아래에 주어진 값은 #if 전처리 지시문에서 사용하기에 적합한 상수 표현식으로 대체되어야합니다. ... 구현 정의 값은 동일한 부호를 사용하여 표시된 값과 크기 (절대 값)가 같거나 커야합니다.

-- number of bits for smallest object that is not a bit-field (byte)
   CHAR_BIT                                            8

따라서 가장 작은 객체는 정확히 CHAR_BIT 비트를 포함해야합니다.


6.5.3.4 sizeof 및 _Alignof 연산자

...

4 char, unsigned char 또는 signed char (또는 그 정규화 된 버전) 유형을 가진 피연산자에 sizeof를 적용하면 결과는 1입니다. ...

따라서 그것들은 (일부) 가장 작은 주소 지정 단위입니다. 분명 int8_t하고 uint8_t또한 그들이 존재 제공 할 수있는 가장 작은 단위를 고려 될 수있다.

7.20.1.1 정확한 너비 정수 유형

1 typedef 이름 intN_t는 너비가 N이고 패딩 비트가없고 2의 보수 표현이있는 부호있는 정수 유형을 지정합니다. 따라서 int8_t는 너비가 정확히 8 비트 인 부호있는 정수 유형을 나타냅니다.

2 typedef 이름 uintN_t는 너비가 N이고 패딩 비트가없는 부호없는 정수 유형을 지정합니다. 따라서 uint24_t는 너비가 정확히 24 비트 인 부호없는 정수 유형을 나타냅니다.

3 이러한 유형은 선택 사항입니다. 그러나 구현에서 너비가 8, 16, 32 또는 64 비트이고 패딩 비트가없는 정수 유형을 제공하고 (부호화 된 유형의 경우) 2의 보수 표현을 갖는 정수 유형을 제공하는 경우 해당 유형 정의 이름을 정의해야합니다.

" 이러한 유형은 선택 사항입니다 " 에 대한 강조 는 내 것입니다. 도움이 되었기를 바랍니다. :)


아무도 지금까지 언급하지 않았다 가능성 : 경우 CHAR_BIT==8와 비정규은 char그것이 어떤 ABI를에 서명되지는 다음 uint8_t의 형식 정의 될 수 char대신 unsigned char. 둘 다 가지고 있다면 그것은 과부하 선택 (그리고 사악한 쌍둥이, 이름 맹 글링), 즉 영향을 미친다로하는 한 적어도이 문제 foo(char)foo(unsigned char)호출, 범위를 foo형식의 인수를 uint8_t선호하는 foo(char)이러한 시스템에.

참고 URL : https://stackoverflow.com/questions/16138237/when-is-uint8-t-%e2%89%a0-unsigned-char

반응형