Два дополнения в Си - PullRequest
       32

Два дополнения в Си

2 голосов
/ 08 июля 2019

Предположим, что 16-разрядная переменная (а) хранится как 16-разрядные без знака. Если я приведу 16-битные числа со знаком, могу ли я сказать, что я прочитал свой номер со знаком (b) как формат дополнения до двух?

uint16_t a = 0xFFF1;
int16_t b;
b = (int16_t)a;

1 Ответ

6 голосов
/ 08 июля 2019

Практически да .Все обычные архитектуры должны дополнять два и обрабатывать преобразования без знака в подпись одинаковой ширины как в основном запретные операции.

Теоретически не всегда .Стандарт C говорит, что преобразования в не _Bool типы не изменяют значения, если значения соответствуют ( 6.3.1.3p1 ), в противном случае для преобразования без знака в подпись вы либо получаете преобразование, определенное реализациейили сигнал повышается ( 6.3.1.3p3 ).

6.3.1.3 Целые числа со знаком и без знака

1 Когда значениес целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.

2 В противном случае, если новый тип является беззнаковым, значение преобразуется повторнодобавление или вычитание более одного максимального значения, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа. 60)

3 В противном случае новый тип подписывается и значение не может бытьпредставлены в нем;либо результат определяется реализацией, либо генерируется определяемый реализацией сигнал.

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

Как отметил * * * * * * * * * * * * * * * * * * * * * * * * * - замечает C2x, исключая специальный случай, C2x должен исключить особый случай. всегда да .

...