2017-12-10 11 views
-1

을 통과 무슨 일이 일어날 지 나는이 문제를 내가 잘못된 결과를 얻을 왜 이해가 안가 :를 sizeof

if(sizeof(int) > -1) 
     cout << "true" << endl; 
    else 
     cout << "false" << endl; 

위는 또한 항상 false 인쇄를! 하지만 정확합니다 :

int n = sizeof(int); 

    // correct 
    if(n > -1) 
     cout << "true" << endl; 
    else 
     cout << "false" << endl; 

아무도 나에게 무슨 일이 있었는지 설명 할 수 있습니까? 고맙습니다.

+0

해결책을 찾는 것이 숙제가 아니십니까? –

+0

한 번에 한 가지 질문하십시오. 두 가지 질문이있는 경우 두 개의 다른 게시물을 작성해야합니다. –

+0

@ manni66 : 아니요. 나는 이런 숙제를 한 번도 보지 못했습니다. 너? lol – WonFeiHong

답변

8

sizeofstd::size_t 유형의 상수로 평가된다. 어떤 프로그램에서 개체의 크기를 포함 할만큼 큰 부호없는 형식입니다. 이전 문장의 키워드는 이며 서명되지 않은입니다.

sizeof(int) > -1을 작성할 때 C++의 필수 승격 규칙은 관계 연산자의 두 피연산자가 모두 동일한 유형 (충분히 큰 것)으로 변환되도록 지시합니다. 이것은 부호없는 유형입니다. 따라서 -1은 매우 큰 숫자로 변환됩니다. SIZE_MAX 정확해야합니다. 직접 비교는 항상 false로 평가됩니다.

그러나 다른 경우에는 초기화를 통해 std::size_tint으로 변환합니다 (정확하게 초기화하려면 복사가되지만 옆에 있습니다). sizeof 연산자가 반환하는 값은 실제로 int에 맞지 않을 수 있습니다.이 경우 값은 유지되지 않습니다. 그러나 귀하의 경우에는 적합합니다 (기본 유형은 상당히 작습니다). int-1과 비교하면 예상되는 결과를 얻을 수 있습니다.

5

sizeof의 결과는 std::size_t 값이며 부호없는 정수 유형입니다. 다시 말해서, 그것은 부정적 일 수 없다.

부호없는 정수를 음수 (예 : -1)와 비교하면 음수는 개별 비트가 큰 양수를 나타내는 것처럼 해석되므로 비교가 거짓입니다.

sizeof이 반환하는 부호없는 정수 값이 부호가있는 int으로 바뀌기 때문에 int n = sizeof(int);의 경우는 예상대로 작동합니다. 따라서 예상되는 산술 방식으로 작동하는 부호있는 정수 두 개를 비교하게됩니다.

+0

당신의 정성에 감사드립니다. – WonFeiHong