Базовое представление C/C++ для char, unsigned char и signed char

Буду ли я прав, если скажу, что базовое представление объекта (битовый шаблон) в каждом из следующих определений одинаково?

char c = 240;
unsigned char c = 240;
signed char c = 240;

Итак, signed-ness имеет значение только тогда, когда c используется в выражении (или приведении)?


person nightlytrails    schedule 30.11.2012    source источник
comment
Я не удивлюсь, если char и signed char будут иметь неопределенное поведение.   -  person melpomene    schedule 30.11.2012
comment
@melpomene, я почти уверен, что правило переполнения со знаком применяется и к начальным значениям. В случае char это зависит от реализации, подписан он или нет.   -  person chris    schedule 30.11.2012
comment
Ваш ответ есть - stackoverflow.com/questions/8385824/   -  person Arsenii Fomin    schedule 30.11.2012
comment
@chris: переполнение со знаком вызывает неопределенное поведение только для арифметических операций. Присваивание/инициализация (т. е. целочисленные преобразования со знаком) не приводят к неопределенному поведению. Вместо этого они производят результаты, определяемые реализацией.   -  person AnT    schedule 30.11.2012


Ответы (1)


В общем случае нельзя говорить, что паттерн тот же, если диапазон signed char не охватывает 240. Если 240 выходит за пределы диапазона, результат этой инициализации с переполнением определяется реализацией (и может привести к сигналу, см. 6.3.1.3/3). То же самое относится к инициализации char, если она подписана.

Язык гарантирует совпадающие представления только для общей части диапазонов signed char и unsigned char. Например. это гарантированно даст тот же шаблон

char c = 10;
unsigned char c = 10;
signed char c = 10;

С 240 такой гарантии в общем случае нет (при условии, что она вне допустимого диапазона).

person AnT    schedule 30.11.2012
comment
Просто интересно, где в стандарте упоминается, что происходит с signed char c = 240;? - person chris; 30.11.2012
comment
@chris: В 6.3 Conversions -> 6.3.1.3 Signed and unsigned integers: 6.3.1.3/3 В противном случае новый тип является подписанным и значение не может быть представлено в нем; либо результат определяется реализацией, либо выдается сигнал, определяемый реализацией. - person AnT; 30.11.2012
comment
Спасибо, я до сих пор не могу найти ничего об этом в стандарте С++ 11 :/ Кажется, вся опубликованная вами часть была уничтожена или полностью переформулирована. - person chris; 30.11.2012
comment
@chris: О, на самом деле я имел в виду стандарт C (C99). В С++ 11 это будет 4,7/3. - person AnT; 30.11.2012
comment
Хотя я уверен, что вы правы во всех практических целях, глядя на §3.9/4 и §3.9.1/1 (С++ 11), мне интересно: а) Хотя в ОП используется слово представление объекта, разве это не то, что нам нужно узнать о представлении значений? b) Действительно ли стандарт гарантирует, что представление значения одинаково для char/signed char/unsigned char? Кстати, я думаю, что цитаты C99 из комментария выше также должны быть частью ответа. - person jogojapan; 30.11.2012
comment
О, это имеет больше смысла, чем мой переход к стандартному заключению C++03. Я не знал, что вопрос был помечен двойным тегом. - person chris; 30.11.2012