it-source

C/C++ bool 타입은 type cast'에서 int로 설정했을 때 항상 0 또는 1로 보증됩니까?

criticalcode 2022. 12. 29. 20:31
반응형

C/C++ bool 타입은 type cast'에서 int로 설정했을 때 항상 0 또는 1로 보증됩니까?

많은 컴파일러가 0 또는 1만을 bool 값으로 유지하고 있는 것 같습니다만, 이것이 항상 기능하는지는 잘 모르겠습니다.

int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?

네:

C++(4 4.5/4)의 경우:

bool 유형의 r 값은 int 유형의 r 값으로 변환할 수 있으며 false는 0이 되고 true는 1이 됩니다.

C에서 값이 다음 값으로 변환되는 경우_Bool, 0 또는 1(806.3.1.2/1)이 됩니다.

스칼라 값이 _Bool로 변환되면 값이 0과 같으면 0이 되고 그렇지 않으면 1이 됩니다.

변환 시int꽤 간단해 int0과 1을 유지할 수 있으므로 값에는 변화가 없습니다(제6.3.1.3항).

C/C++ 인가요?

C/C++라는 언어는 없습니다.

bool type은 type cast'에서 int로 설정했을 때 항상 0 또는 1이 보장됩니다.

C++에서는 $4.5/4 섹션은 다음과 같이 되어 있습니다.

bool 유형의 r 값은 int 유형의 r 값으로 변환할 수 있으며 false는 0이 되고 true는 1이 됩니다.

.

int c = 3 + b;// 4 또는 5?

c 값은 4가 됩니다.

안전한 보트 밖으로 나갈 때의 또 다른 예:

  bool b = false;
  *(reinterpret_cast<char*>(&b)) = 0xFF;
  int from_bool = b;
  cout << from_bool << " is " << (b ? "true" : "false");

출력(g++(GCC) 4.4.7):

  255 is true

FredOverflow의 예에 추가됩니다.

항상은 아니지만...

const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
    int x = b[i];
    if (x & ~1)
    {
        std::cout << x << ' ';
    }
}

시스템 출력:

28 255 34 148 92 192 119 46 165 192 119 232 26 195 119 44 255 34 96 157 192 119
8 47 78 192 119 41 78 192 119 8 250 64 2 194 205 146 124 192 73 64 4 255 34 56 2
55 34 224 255 34 148 92 192 119 80 40 190 119 255 255 255 255 41 78 192 119 66 7
8 192 119 192 73 64 240 255 34 25 74 64 192 73 64

이 이상한 출력의 이유는 표준 3.9.1 6 6에 설명되어 있습니다.

유형 값bool어느 쪽인가true또는false. 사용방법bool초기화되지 않은 자동 객체의 값을 검사하는 등 이 국제 표준에서 "정의되지 않은" 방식으로 기술된 값은 이 객체가 또는 아닌 것처럼 동작하도록 할 수 있다.

패딩 비트가 유형에 대해 예상된 값을 유지하지 못하면 패딩 비트가 있는 유형이 이상하게 작동할 수 있습니다.대부분의 C89 실장에서는 어떤 정수형도 패딩 비트를 사용하지 않았습니다만, C99에서는 이러한 타입을 정의할 필요가 있습니다._Boola를 읽다_Bool모든 비트가 0일 경우 0이 됩니다.0이 아닌 임의의 값 쓰기_Bool읽었을 때 1이 되는 패턴으로 비트를 설정합니다.0을 쓰면 비트가 패턴(모두 비트 0일 수도 있고 아닐 수도 있음)으로 설정되며, 이 패턴은 읽었을 때 0이 됩니다.

실장 매뉴얼에 특별히 지정되어 있지 않는 한 제로 또는 제로 이외의 값을 저장함으로써 생성할 수 없었던 all-bits-zero 이외의 비트 패턴_Bool이 기준에서는 이러한 값을 읽으려고 할 경우 어떤 일이 일어날지에 대해 언급하지 않습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

union boolChar { _Bool b; unsigned char c; } bc;

, 0 ~ 0 」의bc.c 읽습니다.bc.b으로 하다. 하거나 1에서 0으로 저장한다.bc.bbc.c written면면면면면면면면면면면 which which which which which which which which which which which which which which which which 의 원인이 되는 가치관에 대하여bc.b1.0을 하다." " 에 대한 값 :bc.c 읽습니다.bc.b정의되지 않은 동작을 생성합니다.

C pre C99(C90 등)에는 bool 타입이 없지만 C99/C++의 bool 타입은 항상0 또는 1이 보증됩니다.

C에서는 boole 타입이 정의되어 있는지 여부에 관계없이 모든 boole 조작이0 또는 1 중 하나를 반환하는 것이 보증됩니다.

★★★★★★★★★★★★★★★★★.a && b ★★★★★★★★★★★★★★★★★」!a ★★★★★★★★★★★★★★★★★」a || b는, 「C」의, 항상 「C 「C로 0 합니다.a ★★★★★★★★★★★★★★★★★」b.

언급URL : https://stackoverflow.com/questions/4276207/is-c-c-bool-type-always-guaranteed-to-be-0-or-1-when-typecasted-to-int

반응형