2012-03-15 2 views
5

Я смущен о том, как продвижение типа происходит в случае printf и вообще. Я попытался следующий кодprintf тип продвижения и расширение знака

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

Это дает следующий результат:

unsigned char value = 255 
signed char value = -128 

Это оставило меня задаваться вопросом о том, как на самом деле происходит продвижение и является ли знаковое расширение происходит или нет. Если расширение знака выполнено, значение 255 должно быть напечатано как отрицательное значение (-128, оставаясь тем же), и если расширение без знака не было выполнено, то -128 должно было быть напечатано как положительное значение (255 осталось тем же). Пожалуйста, объясни.

ответ

4

Если расширение знака будет сделано, то значение 255 должно быть напечатано как отрицательное значение

Здесь вы ошибаетесь - все значения типа unsigned char в том числе 255, могут быть представлены в int , поэтому промотирование до int от unsigned char просто происходит без какого-либо смешного бизнеса.

Если возникают проблемы, когда значение знака должно быть конвертировано (это другое дело, чем продвижение по службе, и возникает для создания общего типа для операндов) до значения без знака. Если этот подписанный тип имеет отрицательное значение, то преобразование в неподписанный тип изменит значение.

Таким образом, целочисленное продвижение сохраняет значение (включая знак), преобразование может изменить значение.

2

Расширение знака сделано. Но вы не можете подписать расширение unsigned char, потому что у него нет знака. Весь смысл расширения знака состоит в том, чтобы сохранить значение одинаковым. Или, если вы предпочитаете думать об этом таким образом, каждая неподписанная переменная имеет подразумеваемый бит с ноль-знаками. Поэтому, когда он расшифровывается знаком для более крупного типа подписки, бит знака должен быть равен нулю в большем типе.

0

Расширение знака сделано.

Но так как в случае с uc нет знака, так как это unsigned char, поэтому он оставлен положительным.

1

Оба они продвигаются до цепей - следовательно, сохраняя знак.

4

Функция va_arg не имеет информации о ожидаемом типе для части .... Поэтому применяются правила продвижения для функций, объявленных без прототипа. Это означает, что все типы, которые короче int, рекламируются непосредственно int или unsigned. Таким образом, ваша функция printf никогда не видит (un)signed char.

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