32-битное целое * 32-битное целое = 64-битное целое?

StackOverflow https://stackoverflow.com/questions/765228

  •  12-09-2019
  •  | 
  •  

Вопрос

Другими словами, работает ли это так, как ожидалось?

int32 i = INT_MAX-1;
int64 j = i * i;

или мне нужно сначала перевести i на 64-битную версию?

Это было полезно?

Решение

Вам необходимо привести хотя бы один из операндов к умножению.В момент выполнения умножения система не знает, что вы планируете назначить int64.

(Если только int64 на самом деле не является собственным типом int для вашей конкретной системы, что кажется маловероятным)

Другие советы

Это зависит от того, что такое int32 и int64.

Короче говоря, все целые числа увеличиваются как минимум до размера «int» (который может составлять 64 бита) перед любыми арифметическими операциями, а также до размера большего операнда для бинарных операторов, если он имеет больший ранг, чем int.

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

Основной ответ: нет, он не будет делать то, что вы хотите.
Но он делает то, что ожидается.

Две вещи, которые следует отметить относительно математических операций:

  • Оба операнда будут одного типа.
  • Результирующий тип будет таким же, как входной.

Если компилятор заметит несоответствие между операндами, он преобразует один из операндов так, чтобы оба совпадали (см. Какие переменные следует приводить к типам при выполнении математических операций в C/C++?).Примечание:Это делается отдельно от того, что происходит с результатом.

Даны два числа a, b, и каждое число использует биты len_a и len_b.

Ваш тип выходных данных должен иметь как минимум:биты len_a и len_b.

В приведенном выше коде у вас есть два 31-битных числа (поскольку INT_MAX - 1 = 0x7FFFFFFE использует 31 бит), и вам нужно будет привести одно из них к int64_t, потому что оно выполнит 32-битное умножение и переполнение перед преобразованием в int64_t.


Количество бит, необходимое для умножения с фиксированной запятой:

len_output = howManyBits( a * b )
           = len_a + len_b

Быстрый пример, демонстрирующий приведенное выше правило в действии:

a     = 7
len_a = 3

b     = 7
len_b = 3

c = a * b
  = 49 ( decimal )
  = 0x31 ( hex )

len_c = howManyBits( 0x31 ) 
      = 6

Вы можете написать функцию для подсчета битов.Или, если вам просто нужна быстрая проверка работоспособности, чтобы подтвердить это, используйте что-то вроде Windows Calc, который преобразует число в двоичную форму и подсчитывает используемые биты.

Видеть:14.Смешанное использование простых целочисленных типов и типов memsize.http://www.viva64.com/art-1-2-599168895.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top