При приведении типа к символу в C, какие байты используются для создания символа?

Когда вы приводите тип из int в char, вы сокращаете количество используемых байтов с 4 до 1. Как он выбирает, какой байт он собирается использовать для создания char?

Требуется ли старший байт?

Или берет наименее значимый?

Или есть какое-то правило, о котором я должен знать?


person Matt    schedule 05.02.2011    source источник
comment
Могу поспорить, что это поведение undefined, но не верьте мне на слово.   -  person Falmarri    schedule 06.02.2011
comment
ЛСБ конечно. Endianness не имеет значения.   -  person Hans Passant    schedule 06.02.2011


Ответы (2)


C будет брать младший байт при выполнении сужающего преобразования, поэтому, если у вас есть целочисленное значение 0xCAFEBABE и вы конвертируете его в char, вы получите значение 0xBE.

Конечно, нет реальной гарантии, что int — это четыре байта или что char — это один, но я почти уверен, что логика выполнения усечения всегда будет одинаковой и просто отбросит старшие биты, которые не нужны. не вписывается в char.

person templatetypedef    schedule 05.02.2011
comment
Полезно думать о char как о наименьшем целочисленном типе, а не как о типе символов. Если вы выполняете приведение от int к short (предположим, что sizeof(int) > sizeof(short)), конечно, берутся младшие биты значения; то же самое верно для приведения к char. - person zwol; 06.02.2011
comment
имейте в виду, что реализации могут подавать сигнал о сужении подписанных преобразований, если значение не может быть представлено в новом типе; однако неподписанные преобразования всегда четко определены... - person Christoph; 06.02.2011
comment
На самом деле есть гарантия, что char — это один байт. - person Clark Gaebel; 06.02.2011

Если char подписано, оно определяется реализацией, если исходное значение уже не соответствует диапазону значений для char. Реализация совершенно свободна генерировать чепуху (или поднимать сигнал), если она не подходит. Если char не имеет знака (что разрешено стандартом), то значение уменьшается по модулю 1<<CHAR_BIT (обычно 256).

person R.. GitHub STOP HELPING ICE    schedule 05.02.2011