programing

1비트 길이의 데이터 타입을 C로 생성할 수 있습니까?

goodsources 2023. 11. 7. 20:49
반응형

1비트 길이의 데이터 타입을 C로 생성할 수 있습니까?

기본적으로 데이터 유형을 만들고자 합니다.uint1_t.그게 가능하긴 해?

boole 데이터 타입의 크기는 1바이트로 알고 있습니다.그러나 부울 값에는 한 비트만 필요합니다.그래서 C는 기본적으로 bool에 한 비트만 사용합니까?만약 그렇다면 나머지 7개는 어떻게 되는 겁니까?한 비트가 충분한 곳에서 8비트를 사용하는 것은 공간 낭비로 보입니다.

한 비트를 차지하는 유형을 만드는 것은 실제로 가능하지 않습니다.C에서 주소를 지정할 수 있는 가장 작은 단위는char(이것은 정의상 1바이트이며 일반적으로 반드시 8비트 길이일 필요는 없지만, 표준 C에서는 8비트보다 짧을 수 있습니다.)

다음을 통해 접근할 수 있습니다.

typedef _Bool uint1_t;

또는:

#include <stdbool.h>
typedef bool uint1_t;

그러나 부울 변수가 0 또는 1 값만 저장하더라도 (적어도) 1 바이트를 차지할 것입니다.false아니면true.

원칙적으로 비트 필드를 사용할 수 있습니다.

typedef struct
{
    unsigned int x : 1;
} uint1_t;

하지만 그것은 또한 적어도 하나의 바이트를 차지할 것입니다. (그리고 아마도 한 바이트만큼의 바이트를 차지할 것입니다.unsigned int; 일반적으로 4바이트)를 사용해야 합니다..x값에 액세스할 수 있습니다.비트 필드를 사용하는 것은 문제가 있습니다(예: 비트 필드를 보유한 스토리지 유닛이 차지하는 공간과 같이 대부분의 측면이 구현 정의되어 있습니다). 비트 필드를 사용하지 마십시오.

Drew McGowen, Drax, Fiddling Bits가 제안한 수정안을 포함합니다.

일부 사람들이 믿는 것과는 달리, C99에는 한 비트의 데이터 유형이 있습니다: 그것은 다음과 같습니다._Bool. 크기가 1인 비트 필드를 선언할 수도 있습니다.C에서 개별 비트를 어드레싱할 수 없다는 사실은 1비트 데이터 유형이 존재할 수 없다는 것을 의미하지 않습니다.그 논쟁은 기본적으로 사과와 오렌지를 비교하는 것입니다.

그러나 스토리지의 크기가 무엇인지에 대한 유형은 존재하지 않습니다.sizeof)는 1바이트보다 작습니다.

아니요, 불가능합니다. uint8_t가 가장 작은 데이터 유형입니다.구조 내에서는 비트 필드를 사용할 수 있지만, 그 외에는 1비트의 데이터 유형을 가질 수 없습니다.

당신이 만들 수 있는 가장 작은 객체는sizeof == 1. 그 물건은CHAR_BIT거의 모든 플랫폼에서 볼 수 있는 크기의 비트는 8입니다.

그래서 당신이 만들 수 있는 가장 작은 물체는int8_t아카char.

비트 필드를 사용하여 많은 1비트 숫자를 더 큰 개체로 인코딩할 수 있지만, 이것이 문제의 해결책은 아닙니다.

비트 필드를 사용하는 것이 이와 같은 상황에 가장 근접할 수 있습니다.A 내에 설정됩니다.struct그리고 각각의 분야.struct폭을 결정합니다.

예:

struct foo
{
  unsigned int bla   :1;  /* this uses only 1 bit */
}

이 사례는 여전히 다른 부분을 '낭비'합니다.int그러나 만약 당신이 다른 분야를 가지고 있다면 당신은 효과적으로 각각의 비트를 사용할 수 있습니다.int부울 값을 나타내다

http://en.wikipedia.org/wiki/Bit_field

단답형은 "아니오"입니다. 비트 필드를 제외한 모든 유형은 전체 바이트 수에 매핑되어야 합니다(여러 비트 필드가 모두 적합한 경우 동일한 바이트를 차지합니다).

말의 입에서:

6.2.6 형식의 표시

6.2.6.1 일반

1 모든 유형의 표현은 이 하위 조항에 명시된 것을 제외하고는 불특정입니다.

2 비트 필드를 제외하고, 객체는 하나 이상의 바이트의 연속된 시퀀스로 구성되며, 그 수, 순서 및 인코딩은 명시적으로 지정되거나 구현이 정의됩니다.

3 부호가 없는 비트 필드에 저장된 값과 부호가 없는 문자 형식의 객체는 순수 이진 표기법을 사용하여 표시합니다.49)

4 다른 객체 유형의 비트 필드가 아닌 객체에 저장된 값은 다음과 같습니다.n ×CHAR_BITbits, wheren은 해당 유형의 개체 크기(바이트)입니다.값을 유형 개체로 복사할 수 있습니다.unsigned char [n](예를 들어, 에 의해)memcpy); 결과적인 바이트 집합을 다음과 같습니다.값의 개체 표현.비트 필드에 저장된 값은 다음과 같이 구성됩니다.m비트, 어디에m은 비트 필드에 지정된 크기입니다.개체 표현은 다음의 집합입니다.비트 필드는 주소 지정 가능한 저장 장치에 포함되어 있습니다.개체 표현이 동일한 두 값(NaNs 제외)은 동일하지만, 동일한 값을 비교하는 값은 서로 다른 개체 표현일 수 있습니다.
49) 2진 숫자 0과 1을 사용하는 정수의 위치 표현으로, 연속적인 비트로 표현되는 값은 1로 시작하고, 가장 높은 위치의 비트를 제외하고 2의 연속적인 적분 거듭제곱을 곱합니다. (미국 국립 정보 처리 시스템 사전에서 채택.)바이트는 다음을 포함합니다.CHAR_BIT비트 및 유형의 값unsigned char0에서 2 사이입니다CHAR_BIT − 1.

예, a:1에서 1비트 변수를 생성할 수 있습니다. 값만 할당할 수 있지만 검색할 수는 없습니다.

8비트는 유형의 최소 크기입니다.서브바이트 저장이 꼭 필요한 경우 비트 필드를 사용하여 여러 "작은" 요소를 함께 결합할 수 있습니다.

하지만 이것은 거의 큰 문제가 아닙니다.기계는 많은 메모리를 가지고 있고 이런 종류의 메모리 낭비에 대해 걱정할 필요는 거의 없습니다.

언급URL : https://stackoverflow.com/questions/25268106/is-it-possible-to-create-a-data-type-of-length-one-bit-in-c

반응형