продвижение типа printf и расширение знака - PullRequest
5 голосов
/ 15 марта 2012

Меня смущает, как продвижение типов происходит в случае 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 остается тем же).Пожалуйста, объясните.

Ответы [ 5 ]

4 голосов
/ 15 марта 2012

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

4 голосов
/ 15 марта 2012

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

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

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

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

2 голосов
/ 15 марта 2012

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

1 голос
/ 15 марта 2012

Оба преобразуются в целые, следовательно, сохраняя знак.

0 голосов
/ 15 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...