Здесь есть некоторые заблуждения, все из которых можно исправить, пересмотрев первые принципы:
Число - это число.
Когда вы пишете десятичный литерал42
, это число 42.
Когда вы пишете шестнадцатеричный литерал 0x2A
, это все равно число 42.
Когда вы присваиваете любое из этих выражений для int
, int
содержит число 42.
Число - это число.
Какая база используется, не имеет значения.Это ничего не меняет.Запись литерала в шестнадцатеричном виде, а затем присвоение его int
не меняет того, что происходит.Он не делает магическим образом номер, который интерпретируется, обрабатывается или представляется по-другому.
Число - это число.
То, что вы сделали, это присвоение 0xFFFFFFE2
, который является номером 4294967266, до myInt
.Это число превышает максимальное значение [подписано] int
на вашей платформе, поэтому оно переполняет .Результаты не определены, но вы видите «обтекание» до -30, возможно, из-за того, что представление дополнения до двух работает и реализовано в микросхемах и памяти вашего компьютера.
Вот и все.
Это не имеет ничего общего с шестнадцатеричным, поэтому нет никакого "выбора" между шестнадцатеричными и десятичными литералами.То же самое произошло бы, если бы вы использовали десятичный литерал:
myInt = 4294967266;
Более того, если вы искали способ «вызвать» это поведение с циклическим изменением, не делайте этого, потому что переполнение имеет неопределенное поведение.
Если вы хотите манипулировать необработанными битами и байтами, составляющими myInt
, вы можете присвоить ему псевдоним через char*
, unsigned char*
или std::byte*
и поэкспериментировать с этим.