2014-10-28 2 views
4
#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    if(sizeof(int)>=-2)  
     printf("True"); 
    else 
     printf("False"); 
} 

Когда я пытаюсь скомпилировать этот фрагмент кода с помощью Turbo C++, он возвращает False вместо True. Но когда я попытался напечатать значение int, программа возвращается 2.Что возвращает sizeof (int) в этом случае?

Как это возможно? а sizeof(int) возвращает 2 и да 2> = - 2.

+9

Почему вы используете TurboC++? Он не поддерживается и не соответствует стандарту ... Попробуйте [GCC] (http://gcc.gnu.org/), например. на Linux. –

+5

[Целочисленные правила продвижения.] (Http://stackoverflow.com/questions/5563000/implicit-type-conversion-rules-in-c-operators) – jrok

+0

Вы всегда можете 'std :: cout << sizeof (int) < juanchopanza

ответ

16

sizeof(int) заменен на std::size_t, который является неподписанным на большинстве реализаций .

Сравнение подписанного с неподписанным приводит к странному результату из-за того, что подписанное значение было присвоено без знака.

Вы можете получить разумный результат, как показано ниже

if(static_cast<int>(sizeof(int)) >= -2) 

Если вы работаете на C компилятором

if((int)sizeof(int) >= -2) 

Компиляция кода с некоторыми предупреждающие флаги -Wall, например, должны наиболее вероятно предупреждать об/беззнаковое сравнение. (Если вы не игнорируете предупреждения)

+0

, о котором вас предупредил любой достойный компилятор. – dandan78

+5

@ dandan78: Вопрос не в приличном компиляторе. –

+3

'std :: size_t' стандартным является тип без знака. –

2

Тип sizeof: size_t (typedef unsigned int size_t). unsigned int по сравнению с подписанным может привести к неправильному ответу.

+1

Не обязательно 'unsigned int'. 'unsigned long' и' unsigned long long', вероятно, так же часты, если не больше. Единственное требование - это неподписанный интегральный тип. –

+0

Не могли бы вы переписать код для меня так, чтобы он вернул true. Заранее спасибо. – Abdul

+0

@Abdul ответ выше показал метод – wangsquirrel