Неподписанный для подписанного преобразования в C

Гарантируется ли следующее для работы или реализации?

unsigned int a = 4294967294;
signed int b = a;

Значение b является -2 на GCC.

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

1 ответ

Решение

Преобразование a значение для signed int определяется реализацией (как вы правильно упомянули из-за 6.3.1.3p3) . На некоторых системах, например, это может быть INT_MAX (насыщающее преобразование).

За gcc поведение реализации определяется здесь:

Результат или сигнал, возникающий при преобразовании целого числа в целочисленный тип со знаком, когда значение не может быть представлено в объекте этого типа (C90 6.2.1.2, C99 6.3.1.3).

Для преобразования в тип ширины N значение уменьшается по модулю 2^N, чтобы быть в пределах диапазона типа; сигнал не подается.

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

Ответ @ouah говорит вам, что его реализация определяется, но не объясняет, как ваша реализация конкретно дает (-2). Я отвечу на это:

1) Кажется, что ваша реализация имеет 32-битный тип int и 2-дополнительное представление.

2) 4294967294 равен (UINT_MAX - 1) = 0xfffffffe.

В вашей реализации (UINT_MAX - 1) преобразуется в подписанное int следующим образом:

0xfffffffe преобразуется как ~(0xfffffffe) + 1 = (1 в двоичном формате) + 1 = 10 в двоичном формате = 2 в десятичном формате.

Обратите внимание, что до этого преобразования наиболее значимым битом был 1 (в 0xfffffffe), поэтому окончательное число интерпретируется как отрицательное число после вышеупомянутого преобразования. Таким образом, вы получите (-2) в качестве окончательного ответа после преобразования.

Надеюсь, это помогло.

Другие вопросы по тегам