programing

if-statement의 () 연산자 크기

bestprogram 2023. 8. 25. 23:49

if-statement의 () 연산자 크기

#include <stdio.h>
int main(void)
{
    if (sizeof(int) > -1)
        printf("True");
    else
        printf("False");
}

인쇄됩니다.Falsesize of()가 다음 값을 반환하지 않는 이유는 무엇입니까?if?

  1. sizeof함수가 아니라 연산자입니다.괄호는 연산자 이름의 일부가 아닙니다.
  2. 생성된 값의 서명되지 않은 유형이 있기 때문에 실패했습니다.size_t그것은 "일반적인 산술 변환"을 유발합니다.-1서명되지 않은 숫자로 변환됩니다. 이 경우 매우 큰 숫자입니다.

기본적으로 당신은 비교하고 있습니다.4 > 0xffffffffu아니면 적어도 그것에 가까운 것.자세한 내용은 이 질문을 참조하십시오.

서명되지 않은 서명된 정수 프로모션(정확하게는 "일반적인 산술 변환").sizeof유형 값을 산출합니다.size_t그리고 부호 없는 값과 비교했을 때 (어느 것이size_tis), -1은 해당 유형으로 승격되고, 오버플로우되어 커집니다.

부호 없는 정수 오버플로는 잘 정의된 동작을 가지며 모듈로 간주됩니다.2 ^ width,어디에width는 특정 부호 없는 정수 유형의 비트 수입니다.32비트 폭이 있는 경우size_t그리고.int예를 들어, 당신의 비교는 다음과 같습니다.

if (4 > 4294967295u)

그건 명백히 거짓입니다.

  • if 문에서 > 연산자의 피연산자는sizeof(int)그리고.-1.
  • sizeof(int)유형의size_t부호 없는 정수임이 보장됩니다.실제로는.size_t아마 적어도 크기는 될 것입니다.unsigned int모든 시스템에서.
  • -1유형의int와 동등한.signed int.
  • 두 피연산자 모두 정수 유형이 충분히 크기 때문에 정수 승격이 발생하지 않습니다.
  • 그런 다음 두 피연산자는 공식적으로 일반적인 산술 변환이라고 하는 C 규칙에 따라 균형을 맞춥니다.

다음 상태(C116.3.1.8):

...

그렇지 않으면 부호 있는 정수 유형의 피연산자 유형이 부호 없는 정수 유형의 피연산자 유형의 모든 값을 나타낼 수 있는 경우 부호 없는 정수 유형의 피연산자는 부호 있는 정수 유형의 피연산자 유형으로 변환됩니다.

그렇지 않으면 두 피연산자 모두 부호 있는 정수 유형의 피연산자 유형에 해당하는 부호 없는 정수 유형으로 변환됩니다.

  • (서명됨) 이후에 위 중 후자가 발생합니다.inta의 모든 값을 적합시킬 수 없습니다.size_t.
  • 따라서-1부호 없는 정수로 변환됩니다.실제로는.size_t서명되지 않은 길이 또는 서명되지 않은 길이와 동일할 수 있습니다.이러한 변수에 -1을 저장하면 어떤 일이 일어나든 구현 정의 동작입니다.
  • 의 보완 컴퓨터%)에서은 2의 컴 세 퓨 터 보 완 에 컴 (서 의 전 터 퓨 99.9%)로됩니다.0xFFFFFFFF(FF의 수는 지정된 시스템의 int 크기에 따라 달라집니다.)
  • 4 > 0xFFFFFFFF거짓으로 평가됩니다.

크기는 부호 없는 긴int를 생성하는 연산자입니다.하면 따서부없호 longint를 -1로 됩니다.0xffffffff(int의 크기는 4바이트입니다.)

-1은 기본적으로 부호 있는 정수입니다.그러나 서명된 int와 서명되지 않은 int를 비교할 때 컴파일러는 서명되지 않은 int에 대한 암묵적인 형식 캐스팅을 수행합니다.따라서 부호가 없는 -1은 약 4.6기가 값과 같습니다.

따라서, 출력은 다음과 같습니다.false.

이것을 테스트하고 직접 확인해 보십시오.

#include <stdio.h>
main() {
    unsigned int a=4;
    int b = -1;
    //this is what you're doing
    printf("%u vs %u\n", a, (unsigned int)b);
    //this is what you want to do instead
    printf("%d vs %d\n", (int)a, b);
}

언급URL : https://stackoverflow.com/questions/17293749/sizeof-operator-in-if-statement