Почему «unsigned int» + «unsigned int» возвращает «unsigned int»?

Я считаю, что когда вы добавляете два unsigned int значения типа unsigned int вместе, тип данных возвращаемого значения будет unsigned int .

Но добавление двух unsigned int значений типа unsigned int может вернуть значение, которое больше, чем unsigned int .

Так почему unsigned int + unsigned int возвращает unsigned int а не какой-то другой больший тип данных?

Всего 4 ответа


Это будет иметь действительно злые последствия:

Вы действительно хотите, чтобы 1 + 1 был long шрифтом? И (1 + 1) + (1 + 1) станет long long типом? Это нанесло бы ущерб системе типов.

Также возможно, например, что short , int , long и long long имеют одинаковый размер и аналогично для unsigned версий.

Таким образом, неявные правила преобразования типов в том виде, в котором они существуют, являются, вероятно, лучшим решением.

Вы всегда можете заставить проблему с чем-то вроде

0UL + "unsigned int" + "unsigned int"

Давайте представим, что у нас есть язык, в котором добавление двух целых чисел приводит к большему типу. Таким образом, добавление двух 32-разрядных чисел приводит к получению 64-разрядного числа. Что произойдет в выражении следующего выражения?

auto x = a + b + c + d + e + f + g;

a + b составляет 64 бита. a + b + c составляет 128 бит. a + b + c + d - 256 бит ... Это очень быстро становится неуправляемым. Большинство процессоров не поддерживают операции с такими широкими операндами.


Тип varaible не только определяет диапазон значений, которые он может содержать, но небрежно говоря, а также то, как выполняются операции. Если вы добавите два unsigned значения, вы получите unsigned результат. Если вам нужен другой тип результата (например, long unsigned ), вы можете привести:

unsigned x = 42;
unsigned y = 42;
long unsigned z = static_cast<long unsigned>(x) + static_cast<long unsigned>(y);

На самом деле настоящая причина такова: это определяется так. В частности, переполнение без знака хорошо определено в C ++, чтобы обернуть его, и использование более широкого типа для результата unsigned операторов нарушит это поведение.

В качестве надуманного примера рассмотрим этот цикл:

for (unsigned i = i0; i != 0; ++i) {}

Обратите внимание на условие! Предположим, что i0 > 0 , тогда оно может быть ложным только при увеличении максимального значения unsigned результатов в 0 . Этот код запутан и, вероятно, заставит вас поднять бровь или две в обзоре кода, хотя это совершенно законно. Изменение типа результата в зависимости от значения результата или выбор типа результата таким образом, чтобы переполнение не могло произойти, нарушило бы это поведение.


Поскольку переменная + переменная того же типа может быть только равна этой переменной типа (ну, в некоторых случаях это будет, но не в вашем случае)

пример:

int + int = int, int и другое int не могут быть равны числу с плавающей точкой, поскольку у него нет свойств с плавающей точкой. Я надеюсь, что это отвечает на ваш вопрос до свидания!


Есть идеи?

10000