답변:
그것은 당신의 의도를 문서화합니다-당신은 문자가 아닌 작은 숫자를 저장할 것입니다.
당신이 같은 다른 형식 정의를 사용하는 경우 또한 그것은 더 좋은 모습 uint16_t
또는 int32_t
.
unsigned char
하거나 signed char
문서화합니다 char
.
unsigned
것이 unsigned int
정의 에 의한 것이라고 생각 했습니까?
char
문자를 암시하는 것처럼 보이지만 UTF8 문자열과 관련하여 멀티 바이트 문자의 1 바이트 일 수 있습니다. uint8_t를 사용하면 모든 위치에서 문자를 기 대해서는 안됩니다. 즉, 문자열 / 배열의 각 요소는 의미 론적 가정을해서는 안되는 임의의 정수입니다. 물론 모든 C 프로그래머는 이것을 알고 있지만 초보자에게 올바른 질문을 할 수 있습니다.
간단한 시스템이기 때문에 일부 시스템에는 8 비트 유형이 없을 수 있습니다. Wikipedia 에 따르면 :
요구 사항을 충족하는 유형이있는 경우에만 N = 8, 16, 32 또는 64에 대해 정확한 너비 정수 유형을 정의하려면 구현이 필요합니다. 적절한 유형을 지원하더라도 다른 N에 대해서는 정의 할 필요가 없습니다.
그래서 uint8_t
8 비트 = 1 바이트 모든 플랫폼는 것이지만, 존재하지 않을 수 있습니다. 일부 임베디드 플랫폼은 다를 수 있지만 매우 드물어지고 있습니다. 일부 시스템은 char
유형을 16 비트로 정의 할 수 있으며,이 경우 8 비트 유형이 아닐 수 있습니다.
그 (사소한) 문제 외에 @Mark Ransom의 대답 은 내 의견으로는 최고입니다. 데이터를 가장 잘 보여주는 것을 사용하십시오.
또한 uint8_t
(표준의 일부 stdint.h
가 아닌) uint_8
( 헤더에 제공된 C99의 표준 typedef) 를 의미한다고 가정합니다 .
uint8_t
한다는 것을 입증 했습니다 (또는 typedef로). 이것은 8 비트 타입이 스토리지 표현에서 사용되지 않는 비트를 uint8_t
가지기 때문입니다.
typedef unsigned integer type uint8_t; // optional
본질적으로 C ++ 표준 준수 라이브러리는 uint8_t를 전혀 정의 할 필요가 없습니다 (// 선택 주석 참조) )
요점은 구현 독립적 인 코드를 작성하는 것입니다. unsigned char
8 비트 유형일 수는 없습니다. uint8_t
입니다 (사용 가능한 경우).
sizeof(unsigned char)
를 반환 1
합니다. 그러나 시스템 char와 int의 크기가 예를 들어 16 비트와 같은 경우 다음 sizeof(int)
도 반환됩니다.1
내 경험상 uint8_t를 사용하여 8 비트 (및 uint16_t 등)를 사용하고 8 비트보다 작은 필드를 가질 수있는 두 곳이 있습니다. 두 곳 모두 공간이 중요한 곳이므로 디버깅 할 때 데이터의 원시 덤프를 살펴보고 해당 데이터가 나타내는 내용을 신속하게 확인할 수 있어야합니다.
첫 번째는 RF 프로토콜, 특히 협 대역 시스템에 있습니다. 이 환경에서는 최대한 많은 정보를 단일 메시지에 담아 야합니다. 두 번째는 공간이 매우 제한된 플래시 스토리지 (예 : 임베디드 시스템)입니다. 두 경우 모두 컴파일러가 압축 및 압축 풀기를 처리하는 압축 된 데이터 구조를 사용할 수 있습니다.
#pragma pack(1)
typedef struct {
uint8_t flag1:1;
uint8_t flag2:1;
padding1 reserved:6; /* not necessary but makes this struct more readable */
uint32_t sequence_no;
uint8_t data[8];
uint32_t crc32;
} s_mypacket __attribute__((packed));
#pragma pack()
사용하는 방법은 컴파일러에 따라 다릅니다. 동일한 헤더 파일로 여러 다른 컴파일러를 지원해야 할 수도 있습니다. 이것은 장치와 서버가 완전히 다를 수있는 임베디드 시스템에서 발생합니다. 예를 들어 x86 Linux 서버와 통신하는 ARM 장치가있을 수 있습니다.
패킹 된 구조를 사용하는 경우 몇 가지주의 사항이 있습니다. 가장 큰 문제는 회원의 주소를 역 참조하지 않아야한다는 것입니다. 뮤티 바이트로 정렬 된 단어가있는 시스템에서 이로 인해 예외가 잘못 정렬되고 코어 덤프가 발생할 수 있습니다.
일부 사람들은 성능에 대해 걱정하고 이러한 압축 구조를 사용하면 시스템 속도가 느려질 것이라고 주장합니다. 배후에서 컴파일러가 정렬되지 않은 데이터 멤버에 액세스하는 코드를 추가하는 것은 사실입니다. IDE에서 어셈블리 코드를 보면 알 수 있습니다.
그러나 패킹 된 구조는 통신 및 데이터 저장에 가장 유용하므로 메모리에서 작업 할 때 데이터를 패킹되지 않은 표현으로 추출 할 수 있습니다. 일반적으로 메모리의 전체 데이터 패킷으로 작업 할 필요는 없습니다.
다음은 관련 토론입니다.
pragma pack (1) 또는 __attribute__ ((aligned (1))) 작동
gcc의 __attribute __ ((packed)) / #pragma pack이 안전하지 않습니까?
http://solidsmoke.blogspot.ca/2010/07/woes-of-structure-packing-pragma-pack.html
거의 없습니다. 이식성 관점에서, char
8 비트보다 작을 수 없으며 , 보다 작을 수 없습니다 char
. 따라서 주어진 C 구현에 부호없는 8 비트 정수 유형이있는 경우에는 char
입니다. 대안으로, 전혀 속하지 않을 수도 있습니다 typedef
.
8 비트 바이트가 필요하고 다른 것은 필요 없다는 것이 분명하다는 의미에서 코드를 더 잘 문서화하는 데 사용할 수 있습니다. 그러나 실제로 실제로 거의 모든 곳에서 합리적인 기대치입니다 (사실이 아닌 DSP 플랫폼이 있지만 코드가 실행될 가능성은 적으며 프로그램 상단의 정적 어설 션을 사용하면 오류가 발생할 수 있습니다) 그러한 플랫폼).
unsigned char
0에서 255 사이의 값을 보유 할 수 있어야합니다. 4 비트로이를 수행 할 수 있으면 내 모자가 사라집니다.
uint8_t
구현에 추가 하도록합니다. 16 비트 문자가있는 DSP의 컴파일러가 일반적으로 구현되는지 아닌지 궁금합니다 uint8_t
.
#include <stdint.h>
일 것 uint8_t
입니다. 플랫폼에 있으면 플랫폼이 제공합니다. 플랫폼에없는 경우 프로그램은 컴파일되지 않으며 이유는 명확하고 간단합니다.
예를 들어 네트워크 분석기를 작성할 때 매우 중요합니다. 패킷 헤더는 특정 플랫폼의 C 컴파일러가 작동하는 방식이 아니라 프로토콜 사양에 의해 정의됩니다.
거의 모든 시스템에서 uint8_t == unsigned char을 만났지만 C 표준에서는 보장하지 않습니다. 이식 가능한 코드를 작성하려고하는데 메모리 크기가 정확히 중요한 경우 uint8_t를 사용하십시오. 그렇지 않으면 부호없는 문자를 사용하십시오.
uint8_t
8 비트 인 unsigned char
경우 항상 범위와 크기 및 패딩 (없음)과 일치합니다 unsigned char
. 때 unsigned char
8 비트가 아닌, uint8_t
존재하지 않습니다.
unsigned char
8 비트 인 경우 , 확장 된 부호없는 정수형이 아닌 그것의 것이 uint8_t
보장 됩니까? typedef
typedef
unsigned char/signed char/char
가장 작은 유형 인 8 비트 이상 으로 쉽게 추론됩니다 . unsigned char
패딩이 없습니다. 그러기 uint8_t
위해서는 구현이 제공 한 정수 유형 :의 최소 요구 사항과 일치하므로 패딩이없는 8 비트 여야합니다 unsigned char
. "... typedef가 보장된다 ..."에 관해서는 게시하기 좋은 질문처럼 보입니다.