На другой день, I came across эта конструкция:Насколько переносится литье -1 в неподписанный тип?
static_cast<size_type>(-1)
в некотором примере кода C++, который, вероятно, (в зависимости от деталей, где size_type
от), чтобы быть эквивалентно следующему C:
(size_t)(-1)
Как я понимаю, он работает на основе того, что представление -1 в двухпараметрической арифметике равно 11111...1
, для такого количества бит, как у вас есть, так что это быстрый способ получить максимальное значение, size_t
может удержать. Тем не менее, я понимаю, что C не гарантирует, что будет использоваться двойной набор; если реализация C использует свое дополнение, это будет на 1 меньше максимального значения, и если оно использует знаковое значение, оно будет чуть более половины максимального значения.
Есть ли какая-то морщинка, которая мне не хватает, что гарантирует, что это работает правильно, независимо от того, используется ли выражение целых чисел? Различия между C и C++ (многие удивительные вещи)?
Если вы хотите быть уверенным, всегда есть 'std :: numeric_limits :: max()'. –
UncleBens
Я думаю, что такие ситуации, почему у вас есть static_cast и reinterpret_cast на языке - static_cast может дать вам что-то предсказуемое (и, следовательно, полезно), но которое может иметь более медленную реализацию на некоторых платформах, тогда как reinterpret_cast может избавиться от каких-либо гарантий. – Kylotan
Это ИМХО лучший способ получить несколько бит.Опционы с использованием '~ 0U' тоже работают (и если вы забудете добавить' U' и do '~ 0, вы можете в конечном итоге со всеми битами 0, например), но используя' -1', приведённый к типу 'unsigned' , он всегда работает независимо от типа. Поэтому вам не нужно заботиться о том, чтобы использовать 'ULL' или сначала использовать' unsigned short' - вы можете просто использовать '-1' и назначить его :) См. Также http://stackoverflow.com/questions/809227/ is-it-safe-to-use-1-to-set-all-bits-to-true –