В C++, каково различие между 1 и 1i64?

Для округления необходимо, вероятно, использовать функции, определяемые C в math.h.

int roundedX = round(x);

Удерживают Опцию и дважды щелкают по round in Xcode, и это покажет Вам страницу справочника с различными функциями для округления различных типов.

20
задан lavinio 12 August 2009 в 03:49
поделиться

4 ответа

1 имеет тип int в соответствии со стандартом C ++. В 64-битном компиляторе Microsoft int имеет sizeof = 4 байта, это означает, что int является 32-битной переменной. 1i64 имеет тип __ int64 .

Когда вы используете оператор сдвига, тип результата такой же, как и тип левого операнда. Это означает, что сдвигая 1 вы получите 32-битный результат. Компилятор Microsoft предполагает, что это может быть не то, что вы ожидаете (на 64-битной платформе), и выдает предупреждение.

При использовании 1i64 результат будет 64-битным на обеих платформах. j и 0 будут неявно преобразованы в 64-битные. Таким образом, все выражение будет вычислено в 64-битных переменных, и результат будет bool .

11
ответ дан 30 November 2019 в 01:21
поделиться

1i64 Я считаю, что это должно быть 64-битное целое число со знаком. Я не могу заявить о каком-либо опыте в реализации Microsoft, но в GCC решением для поддержки 64-битных целых чисел на 32-битных процессорах было создание длинных двойных слов с использованием структур и различных макросов черной магии. Следовательно, i64 должен быть совместимым.

Что касается последнего бита вуду - единственный пункт в указании 1u, потому что возможно, что если k достаточно велико, результат сдвига будет соответствовать / превышать 32-битное хранилище, и в этом случае результат будет другим, если операнд LH рассматривается как целое число со знаком или без знака.

1
ответ дан 30 November 2019 в 01:21
поделиться

Поскольку этот код является "и" 64-битной переменной j с (32-битным) результатом битового сдвига результат будет «расширен» компилятором до 64-битного.

Вы, вероятно, захотите контролировать то, как второй операнд для 'и 'вычисляется, поэтому компилятор предлагает вам использовать полные 64 бита, сделав первый операнд __ int64 . Это безопасно в 32-битной версии, но вам следует посмотреть на тип j , чтобы решить, какой оператор будет 32-битным или 64-битным.

Это особенно важно во втором бите, где результат используется как индекс.

0
ответ дан 30 November 2019 в 01:21
поделиться

Суффикс i64 специфичен для Microsoft. Для большей переносимости (если вас это беспокоит) можно использовать макрос INT64_C () из stdint.h :

#include <stdint.h>

// ...

if ((j & (INT64_C( 1) << k)) != 0) { ... }

К сожалению, в MS нет stdint.h как часть их библиотеки C (похоже, у большинства других компиляторов он есть), но, к счастью, вы можете получить его из нескольких источников:

Теперь у вас будет 64- битовая константа, которая будет работать с широким спектром компиляторов.

Насколько вам может понадобиться 64-битное значение, это зависит от типов различных частей выражения. Было бы полезно знать типы id ,

4
ответ дан 30 November 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: