Если мы умножим два типа uint32_t
, и они типа int
, эта система имеет 63 бита значений и один знаковый бит, то эти значения преобразуются в int
(целые акции), умножаются и преобразуются обратно до uint32_t
. Промежуточный результат не может быть представлен int
: 2^32-1 * 2^32-1 > 2^63-1
и запускает переполнение целых чисел со знаком, что вызывает неопределенное поведение.Целочисленные акции, биты значений и умножение
Значение UINT32_MAX
is 2^32-1
, так как uint32_t
может содержать 32 бита значений.
uint32_t a = UINT32_MAX ;
uint32_t b = UINT32_MAX ;
uint32_t c = a*b ;
Поскольку платформы, имеющие int размером 64 бит, являются общими, верно ли мое заключение? Программист ожидал, что результат будет завершен, так как тип без знака, но целые рекламные акции вызовут неопределенное поведение из-за подписанного переполнения.
@LPs Ну, это явно не так. Unsigned не может переполняться. Например, на платформе, где uint32_t не будет преобразован в int и останется без знака. Но это был не мой вопрос. – reader
Действительно ли это первая часть? 'UINT32_MAX * UINT32_MAX' установил бы верхний бит (это FFFFFFFE00000001), если у вас было 64-битное ints, это не разрешено? – harold
@harold Да, он бы переполнил int, даже если int имел 63 бита ценности. Что ж, это проще. – reader