Неподписанный для подписанного преобразования в 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) в качестве окончательного ответа после преобразования.
Надеюсь, это помогло.