programing

고정 길이 데이터 유형(C/C++)

kingscode 2022. 9. 2. 00:05
반응형

고정 길이 데이터 유형(C/C++)

, 그렇다, 이런 얘기를 요.int플랫폼마다 다를 수 있습니다.

이 '를 때, 수 하는 입니다. 무엇이 잘못되었는가, 프로그램이 어떤 문제를 가정했을 때int되어 4바이트인데 다른 플랫폼에서는 2바이트로 되어 있나요?

을 하다이 이 를 어떤 할 수 있다는 것을 있습니다.typedefs를 들어, '가 있다'와 u8 ,u16 ,u32 (, 16비트, 32비트로부터의 ).제 질문은 이것이 보통 어떻게 이루어집니까? (저는 타입을 말하는 것이 아닙니다.)stdint))) - ))))))) 32 )))))?

u8, u16, u32와 같은 변수가 있는 경우 플랫폼에 관계없이 8비트, 16비트, 32비트가 보증되는 것과 같은 유형의 def로 이 문제를 해결한다는 것을 알고 있습니다.

특정 크기의 유형이 없는 플랫폼도 있습니다(예를 들어 TI의 28xx, char의 크기는 16비트).이 경우 8비트 타입은 사용할 수 없습니다(필요한 경우를 제외하고 퍼포먼스 히트를 가져올 수 있습니다).

이것은 보통 어떻게 이루어집니까?

보통 typedefs. c99(및 c++11)의 헤더에 이러한 typedefs가 있습니다.그러니까 그냥 쓰세요.

프로그램이 int를 4바이트라고 가정할 때, 다른 플랫폼에서는 2바이트라고 가정할 때, 무엇이 잘못되었는가 하는 예를 들어줄 수 있는가?

가장 좋은 예는 크기가 다른 시스템 간의 통신입니다.사이즈가 다른 플랫폼 간에 int의 배열을 송신하는 경우는, 매우 주의가 필요합니다.

또한 32비트 플랫폼에서 int 배열을 바이너리 파일로 저장하고 64비트 플랫폼에서 재해석합니다.

'다보다'와 같은 은 절대 .short,int,unsigned int

기본적으로 "표준에 의해 보장되지 않는 한 폭에 의존하지 마십시오."

플랫폼에 완전히 의존하지 않고 값 33000을 부호 있는 정수로 저장하려면int★★★★★★★int -32767로로 합니다.32767 ★★★★★★★★★★★★★★★★★」-32768로로 합니다.32767(1/twos 보정에 따라 다름)보통 32비트이기 때문에 33000을 저장할 수 있지만, 그것만으로는 충분하지 않습니다.이 값을 얻으려면>16bit '형'을 하면 됩니다.따라서, 간단하게 선택할 수 있습니다.int32_t ★★★★★★★★★★★★★★★★★」int64_t이 타입이 존재하지 않는 경우 컴파일러에 의해 에러가 통지됩니다만, 사일런트 에러는 아닙니다.

두 번째: C++11은 고정 폭 정수 타입의 표준 헤더를 제공합니다.사용하시는 플랫폼 상에 존재하는 것은 보증되지 않지만, 존재하는 경우에는 정확한 폭의 것이 보증됩니다.cppreference.com 에서 이 문서를 참조해 주세요.형식은 다음과 같습니다.int[n]_t ★★★★★★★★★★★★★★★★★」uint[n]_t서 ''는n8,16,32 ★★★★★★★★★★★★★★★★★」64.<cstdint> . 。C ""입니다.<stdint.h>.

인 C규격을 .typedef를 들어)#define다음과 같이 컴파일러에 전달되는 문자열:

gcc -DINT16_IS_LONG ...

오늘날(C99 이상)에는 다음과 같은 특정 유형이 있습니다.uint16_t열여섯 살

다음을 포함하면stdint.h 、 「 」 ed 、 「 」에 되어 있듯이, 한 비트폭 타입, 그, 을 얻을 수 C99 7.18 Integer types <stdint.h>구현에 호환되는 유형이 있는 경우 이러한 유형을 제공해야 합니다.

, 매우 한 것은 「 」입니다.inttypes.h타입의 을 위한 합니다(예: which이 。printf ★★★★★★★★★★★★★★★★★」scanf★★★★★★★★★★★★★★★★」

첫 번째 질문:정수 오버플로우

질문의 , 「」에 대해서: 「」에 대해서,typedef 정수, 32비트 정수, 32비트, "32비트"int사용:4 " " " " , " :

 typedef unsigned int u32;

상에서는, 「」가int, 2바이트는 2바이트입니다.long 4 바이트:

typedef unsigned long u32;

이 방법에서는 유형을 크로스 플랫폼으로 만들기 위해 헤더 파일을 하나만 수정하면 됩니다.

플랫폼 고유의 매크로가 있는 경우 수동으로 변경하지 않아도 됩니다.

#if defined(PLAT1)
typedef unsigned int u32;
#elif defined(PLAT2)
typedef unsigned long u32;
#endif

C99 의 경우stdint.h원되,,,,권권권권권

통상, 이 문제는, 최대수를 넘었을 때나 시리얼 할 때 발생합니다.다른 사람이 명시적으로 크기를 가정할 때 덜 일반적인 시나리오가 발생합니다.

첫 번째 시나리오에서는:

int x = 32000;
int y = 32000;
int z = x+y;        // can cause overflow for 2 bytes, but not 4

두 번째 시나리오에서는

struct header {
int magic;
int w;
int h;
};

그 후 하나는 fwrite로 넘어갑니다.

header h;
// fill in h
fwrite(&h, sizeof(h), 1, fp);

// this is all fine and good until one freads from an architecture with a different int size

세 번째 시나리오:

int* x = new int[100];
char* buff = (char*)x;


// now try to change the 3rd element of x via buff assuming int size of 2
*((int*)(buff+2*2)) = 100;

// (of course, it's easy to fix this with sizeof(int))

비교적 새로운 컴파일러를 사용하고 있다면, 타입 사이즈를 확실히 하기 위해 uint8_t, int8_t 등을 사용하고 싶습니다.

오래된 컴파일러에서 typedef는 보통 플랫폼 단위로 정의됩니다.예를 들어 다음과 같은 작업을 수행할 수 있습니다.

 #ifdef _WIN32
      typedef unsigned char uint8_t;
      typedef unsigned short uint16_t;
      // and so on...
 #endif

이렇게 하면 플랫폼별로 해당 플랫폼의 세부사항을 정의하는 헤더가 생성됩니다.

수동으로 궁금한데 플랫폼에 관계없이 어떤 유형이 항상 32비트라고 말하도록 강제하려면 어떻게 해야 합니까?

이 예상하는C++ 컴파일이 C++ 프로그램 컴파일을 합니다.static_assert어딘가에.나는 이것을 활자의 폭에 대한 추측이 이루어지는 곳에 덧붙이고 싶다.

static_assert(sizeof(int) == 4, "Expected int to be four chars wide but it was not.");

chars일반적으로 사용되는 플랫폼의 크기는 8비트이지만 모든 플랫폼이 이와 같이 동작하는 것은 아닙니다.

첫 번째 예시는 다음과 같습니다.

int a = 45000; // both a and b 
int b = 40000; // does not fit in 2 bytes.
int c = a + b; // overflows on 16bits, but not on 32bits

cstdintheader에서는 모든 유형예: header, header)을 할 수 .int8_t,uint8_t정의되어 은 이 입니다.다양한 아키텍처 간에 다른 것은 이 헤더 파일뿐입니다.int16_t하다

 typedef int int16_t;

다른 것에 대해서:

 typedef short int16_t;

쓰일 수 int_least16_t

  1. 유형이 생각보다 작으면 저장해야 하는 값을 저장하지 못할 수 있습니다.
  2. 하려면 , 해, 「」를 정의합니다.typedef" " "에 의거한#ifdef를 참조해 주세요.

프로그램이 int를 4바이트라고 가정할 때, 다른 플랫폼에서는 2바이트라고 가정할 때, 무엇이 잘못되었는가 하는 예를 들어줄 수 있는가?

를 들어의 입력을 읽도록 10만 개의 입력값을 해 보십시오.unsigned int 없는 는 4).32비트 (32비트)의 int 4,294,967,295의 int)라고 합니다.플랫폼(또는 컴파일러)에서 16비트 정수(16비트 부호 없는 int는 65,535까지만 카운트 가능)를 사용하여 코드를 컴파일하면 이 값은 용량 때문에 65535를 넘고 잘못된 카운트를 나타냅니다.

컴파일러는 표준을 준수할 책임이 있습니다.「 」를 <cstdint> ★★★★★★★★★★★★★★★★★」<stdint.h>표준 사이즈에 따른 형식을 제공해야 한다.

컴파일러는 어떤 플랫폼의 코드를 컴파일하고 있는지 알고 있으며, 내부 매크로 또는 마직을 생성하여 적절한 유형을 구축할 수 있습니다.를 들어,가 「」, 「32」를 생성합니다.__32BIT__ 그리고 에는 이 이 macro macro, 、 、 、 、 in in 、 음음 、 음음 in in in in in in in in in macro in macro 。stdint더더: :

#ifdef __32BIT__
typedef __int32_internal__ int32_t;
typedef __int64_internal__ int64_t;
...
#endif

사용할 수 있습니다.

비트 플래그는 단순한 예입니다.0x420은 문제가 발생하므로 마스크할 수 없습니다.또한 모든 것이 16비트에 맞도록 잘리거나 깨지는 경우 17번째 위치에 비트가 설정되어 있는지 확인할 수 없습니다.

언급URL : https://stackoverflow.com/questions/20237451/fixed-length-data-types-in-c-c

반응형