0

Если мы умножим два типа 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 бит, являются общими, верно ли мое заключение? Программист ожидал, что результат будет завершен, так как тип без знака, но целые рекламные акции вызовут неопределенное поведение из-за подписанного переполнения.

+0

@LPs Ну, это явно не так. Unsigned не может переполняться. Например, на платформе, где uint32_t не будет преобразован в int и останется без знака. Но это был не мой вопрос. – reader

+0

Действительно ли это первая часть? 'UINT32_MAX * UINT32_MAX' установил бы верхний бит (это FFFFFFFE00000001), если у вас было 64-битное ints, это не разрешено? – harold

+0

@harold Да, он бы переполнил int, даже если int имел 63 бита ценности. Что ж, это проще. – reader

ответ

0

Если у вас есть такой непонятный 64-разрядный тип int с 32 битами значений, он по-прежнему имеет ту же точность, что и uint32_t. Учитывая, что 6.3.1.1, похоже, касается только точности, когда дело доходит до определения ранга конверсии, я не думаю, что 64-разрядный int с таким же количеством битов значения, что и uint32_t, можно считать более высоким рангом преобразования , Поэтому никакого целостного поощрения не должно быть.

Вы, конечно, все равно получите переполнение независимо от того, если есть целое продвижение или нет, потому что UINT32_MAX*2 не может поместиться в uint32_t, ни в своих своеобразных 64-разрядной с-32 значений бит int.

+0

Нет int, чтобы иметь 64 бита в целом и 31 биты заполнения. Я думаю, что я четко заявил, что: * 32 бита ценности, один бит знака и 31 бит заполнения *. Целое число с 32 битами значения может представлять все значения uint32_t, так как uint32_t имеет ровно 32 бита значений. – reader

+0

@reader А, неправильно прочитал эту часть. Позвольте мне уточнить ответ. – Lundin

+0

Извините, я серьезно отредактировал этот вопрос. – reader