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
'UFO ET IT' 카테고리의 다른 글
JPA 및 Criteria API-특정 열만 선택 (0) | 2020.12.12 |
---|---|
테스트 목적으로 자체 서명 된 SSL 인증서를 만드는 방법은 무엇입니까? (0) | 2020.12.12 |
Bearer 토큰은 Web API 2에서 서버 측에 어떻게 저장됩니까? (0) | 2020.12.12 |
TensorFlow에서 학습 한 모델에서 일부 가중치 값 가져 오기 (0) | 2020.12.12 |
모노 이드 동형은 정확히 무엇입니까? (0) | 2020.12.12 |