2012-05-02 3 views
0

У меня просто отличная головоломка для программирования. Почему же?Сравнение двух переменных

#include <stdio.h> 
#include <limits.h> 

int main(int argc, char *argv[]) 
{ 
    unsigned int x = ULONG_MAX; 
    char y = -1; 
    if (x == y) printf("That is same."); 

    return 0; 
} 

Я думаю, что unsigned int преобразуется в подписанный символ и, следовательно, будет -1. Это может быть стандарт для сравнения подписанного и неподписанного типа. Я не знаю ...

+2

Это домашнее задание? Пожалуйста, используйте тег [tag: Homeework], если это так. –

+0

Нет, это не так. ;-) – RePRO

+0

это DUP из http://stackoverflow.com/questions/6636793/what-are-the-general-rules-for-comparing-different-data-types-in-c –

ответ

2

В tiff между signed char и unsigned int, unsigned int побед!

Его нравится

Size does matter

Здесь -1 будут преобразованы в unsigned int, который ULONG_MAX и, следовательно, if() условие истинно.

В С, размер имеет значение. Переменные всегда преобразуются в максимальный размер среди них.

+0

Для полноты: поскольку 'y' является символом' char', который подписывается, значение расшифровывается знаком на 'unsigned int', поэтому мы получаем' 11 ... 11' - что точно соответствует 'ULONG_MAX' , –

+0

Дает мне значения -1 и -1. Зачем? – RePRO

+0

@RePRO Я думаю, что вы печатаете значения, используя 'printf''% d'. И, следовательно, вы видите '-1'. '% d' интерпретирует значение как целое число со знаком, которое преобразует' ULONG_MAX' в '-1'. Числовое представление такое же, но интерпретации будут отличаться. '==' поддерживает 'unsigned int', тогда как'% d' поддерживает 'signed int' –

1

Много лет назад я узнал пару вещей. Один из них сравнивался с типами.

я либо кастовал char к unsigned int, если значение по unsigned int «s больше sizeof char. Или используйте другой способ, если значения unsigned int должны быть ограничены sizeof char. Таким образом, вы сообщаете компилятору, как вы сравниваете значения, и это также поможет сопровождающим.