8 개의 논리적 참 / 거짓 값을 1 바이트 안에 저장합니까?
저는 SRAM이 2KB에 불과한 마이크로 컨트롤러로 작업 중이며 일부 메모리를 절약해야합니다. 비트 필드를 사용하여 8 0
/ 1
값을 단일 바이트에 어떻게 넣을 수 있는지 알아 내려고 노력 했지만 제대로 해결할 수는 없습니다.
struct Bits
{
int8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
int main(){
Bits b;
b.b0 = 0;
b.b1 = 1;
cout << (int)b.b0; // outputs 0, correct
cout << (int)b.b1; // outputs -1, should be outputting 1
}
무엇을 제공합니까?
모든 비트 필드 멤버는 부호있는 1 비트 정수입니다. 2의 보수 시스템에서는 0
또는 -1
. 사용하여 uint8_t
원하는 경우 0
및 1
:
struct Bits
{
uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
주의 사항-표준은 실제로 비트 필드에 대한 구현 체계를 시행하지 않습니다. Bits
1 바이트가 될 것이라는 보장은 없으며 , 가상적으로 더 커질 수도 있습니다.
그러나 실제로 실제 구현은 일반적으로 명백한 논리를 따르며 "거의 항상"크기는 1 바이트이지만 다시 보장 할 필요는 없습니다. 확실하게하고 싶다면 수동으로 할 수 있습니다 .
BTW -1
는 여전히 true
있지만-1 != true
언급했듯이 이러한 변수는 부호 비트로 만 구성되므로 사용 가능한 유일한 값은 0
및 -1
입니다.
이러한 비트 필드에 더 적합한 유형은 bool
. C ++ 14 §9.6 / 4 :
true
또는 값 이 임의의 크기 (1 비트 비트 필드 포함)false
유형bool
의 비트 필드에 저장 되면 원래bool
값과 비트 필드의 값이 동일하게 비교됩니다.
예, std::uint8_t
작업을 수행하지만 가장 적합한 것을 사용하는 것이 좋습니다. 에 대한 캐스트와 같은 것은 필요하지 않습니다 std::cout << (int)b.b0;
.
부호있는 정수와 부호없는 정수가 답입니다.
시그널링은 비트의 해석 일 뿐이며 -1 또는 1은 컴파일러에 의해 cout 함수 (검색 연산자 오버로딩)에 "공개"되었으므로 "변수 유형"을 해석하는 '인쇄'직렬 변환기 일뿐입니다. 비트는 다음과 같습니다. 동일, 그 값도 (켜짐 / 꺼짐)-1 비트 만 있기 때문입니다.
그것에 대해 신경 쓰지 마십시오.하지만 명시 적으로하는 것이 좋습니다. 따라서 unsigned로 변수를 선언하는 것이 좋습니다. "print"(cout)와 같은 직렬 변환기에 값을 설정하거나 가져올 때 컴파일러에 적절한 코드를 마운트하도록 지시합니다. ).
"COUT"연산자 오버로딩 : "cout"은 매개 변수 오버로딩이 컴파일러에게 호출 할 함수를 지시하는 일련의 함수를 통해 작동합니다. 따라서 두 개의 함수가 있습니다. 하나는 서명되지 않은 것을 수신하고 다른 하나는 서명 된 것을 수신하므로 동일한 데이터를 다르게 해석 할 수 있으며이를 변경하여 컴파일러가 캐스트를 사용하여 다른 하나를 호출하도록 지시 할 수 있습니다. cout << myclass 참조
참고 URL : https://stackoverflow.com/questions/29855708/storing-8-logical-true-false-values-inside-1-byte
'Program Tip' 카테고리의 다른 글
Json에서 getString ()과 optString ()의 차이점 (0) | 2020.11.17 |
---|---|
Pandas 데이터 프레임의 열을 1 위로 이동 하시겠습니까? (0) | 2020.11.17 |
GNU C 매크로 envSet (name)에서 (void) ""이름은 무엇을 의미합니까? (0) | 2020.11.17 |
Convert.ToBoolean 및 Boolean.Parse는 0과 1을 허용하지 않습니다. (0) | 2020.11.17 |
django의 auth_user.username이 varchar (75)가 될 수 있습니까? (0) | 2020.11.17 |