2015-10-22 4 views
2

В чем разница между этими двумя выражениями линии:Разница между значением без знака и значением записи?

#define value (unsigned char) 0x1f 
#define value 0x1fu 

я обычно оба выражения в примерах в одном файле .c. Есть ли разница между поведением компилятора?

+6

Я никогда не видел никого из этих людей и искренне надеюсь, что никогда не буду. Это не скомпилируется. Пожалуйста, проверьте _exactly_, что вы хотели напечатать и исправить свой вопрос. – gnasher729

+0

Ребята, давайте порежем Георгию какое-то слабое. Отсутствующий идентификатор макроса легко фиксируется. – Jens

+0

Я ** забыл ввести идентификатор **, очень жаль !!! – Georgiev

ответ

3

Предположит, что мы исправить сломанные макросы использовать идентификатор, разницу между

#define FOO (unsigned char)0x1f 

и

#define FOO 0x1fu 

их типа. Тип первого определения - unsigned char, а второй - unsigned int. Вы можете увидеть это, когда вы вычислить результат sizeof оператора на каждом:

printf ("%zu\n", sizeof(FOO)); 

которые, скорее всего, выход различных значений.

1

Ни один из них не работает, разница не существует, поскольку ни одна из этих работ не работает. Теперь, если вы имеете в виду:

#define var 0x1f 

Означает, что буквальное использование фразы var воли теперь равной 0x1f

#define var (unsigned char) 0x1f 

Означает, что буквальное использование фразы var воли теперь на равных (unsigned char) 0x1f

Разница заключается в том, что первый var равен 0x1f по умолчанию. Обозначает целочисленный литерал (эквивалент 31). Второе представляет собой целое число буквальное приведение к беззнаковому полукоксу (по-прежнему эквивалентно 31 в Int значении, но теперь больше похожи '\31')

+0

Это не ответ на вопрос о различии между 2 '# define..'. – mch

+0

@mch это, так как первое предложение ясно означает, что ни одно из них не является допустимым. Но я редактировал фактическую разницу внизу, ради полноты – Magisch

Смежные вопросы