Другими словами, как мне убедиться, что 1 << n
for не переполняется n < 256
?
В настоящее время я использую uint256(1) << n
.
Есть ли лучший способ, или гарантируется, что выражение uint256(1)
будет заменено постоянным значением во время компиляции (а не вычислено во время выполнения)?
Спасибо.
Согласно документации Solidity, в случае 1<<n
, 1
останется произвольно точным, пока не будет преобразовано в нелитеральные типы, поэтому все должно быть в порядке.
Числовые литеральные выражения сохраняют произвольную точность до тех пор, пока они не будут преобразованы в нелитеральный тип (т. е. при использовании их вместе с нелитеральным выражением). Это означает, что вычисления не переполняются, а деления не усекаются в числовых литеральных выражениях.
Константы в исходном коде могут быть приведены к типам, предлагающим наименьшую точность, которая будет поддерживать значение. Это может привести к неприятностям. Неожиданное неявное приведение в экспоненциальном операторе Solidity
Вы можете избежать подобных проблем, явно приведя их с высокой точностью.
Учитывать.
if(uint(1) < n) {}
Надеюсь, поможет.
хорошая вибрация
1 << n
последовательно усекается задолго до того, какn
достигает 256 (не совсем проверял, когда, но я предположил, что оно переполняется вn == 8
, из-за того, что он1
помещается вuint8
).хорошая вибрация
1 << n
из функции, которая возвращаетuint256
: «Предупреждение: результат сдвига имеет тип uint8 и, следовательно, может переполниться. Заглушите это предупреждение, преобразовав литерал в ожидаемый тип».