Program Tip

8 개의 논리적 참 / 거짓 값을 1 바이트 안에 저장합니까?

programtip 2020. 11. 17. 21:01
반응형

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원하는 경우 01:

struct Bits
{
    uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};

주의 사항-표준은 실제로 비트 필드에 대한 구현 체계를 시행하지 않습니다. Bits1 바이트가 될 것이라는 보장은 없으며 , 가상적으로 더 커질 수도 있습니다.

그러나 실제로 실제 구현은 일반적으로 명백한 논리를 따르며 "거의 항상"크기는 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

반응형