Для округления необходимо, вероятно, использовать функции, определяемые C в math.h.
int roundedX = round(x);
Удерживают Опцию и дважды щелкают по round
in Xcode, и это покажет Вам страницу справочника с различными функциями для округления различных типов.
1
имеет тип int
в соответствии со стандартом C ++. В 64-битном компиляторе Microsoft int
имеет sizeof = 4 байта, это означает, что int
является 32-битной переменной. 1i64
имеет тип __ int64
.
Когда вы используете оператор сдвига, тип результата такой же, как и тип левого операнда. Это означает, что сдвигая 1
вы получите 32-битный результат. Компилятор Microsoft предполагает, что это может быть не то, что вы ожидаете (на 64-битной платформе), и выдает предупреждение.
При использовании 1i64
результат будет 64-битным на обеих платформах. j
и 0
будут неявно преобразованы в 64-битные. Таким образом, все выражение будет вычислено в 64-битных переменных, и результат будет bool
.
1i64 Я считаю, что это должно быть 64-битное целое число со знаком. Я не могу заявить о каком-либо опыте в реализации Microsoft, но в GCC решением для поддержки 64-битных целых чисел на 32-битных процессорах было создание длинных двойных слов с использованием структур и различных макросов черной магии. Следовательно, i64 должен быть совместимым.
Что касается последнего бита вуду - единственный пункт в указании 1u, потому что возможно, что если k достаточно велико, результат сдвига будет соответствовать / превышать 32-битное хранилище, и в этом случае результат будет другим, если операнд LH рассматривается как целое число со знаком или без знака.
Поскольку этот код является "и" 64-битной переменной j
с (32-битным) результатом битового сдвига результат будет «расширен» компилятором до 64-битного.
Вы, вероятно, захотите контролировать то, как второй операнд для 'и 'вычисляется, поэтому компилятор предлагает вам использовать полные 64 бита, сделав первый операнд __ int64
. Это безопасно в 32-битной версии, но вам следует посмотреть на тип j
, чтобы решить, какой оператор будет 32-битным или 64-битным.
Это особенно важно во втором бите, где результат используется как индекс.
Суффикс i64
специфичен для Microsoft. Для большей переносимости (если вас это беспокоит) можно использовать макрос INT64_C ()
из stdint.h
:
#include <stdint.h>
// ...
if ((j & (INT64_C( 1) << k)) != 0) { ... }
К сожалению, в MS нет stdint.h
как часть их библиотеки C (похоже, у большинства других компиляторов он есть), но, к счастью, вы можете получить его из нескольких источников:
Теперь у вас будет 64- битовая константа, которая будет работать с широким спектром компиляторов.
Насколько вам может понадобиться 64-битное значение, это зависит от типов различных частей выражения. Было бы полезно знать типы id
,