Неявное преобразование типа для побитовой операции - PullRequest
0 голосов
/ 09 июля 2020

У меня есть эта операция:

uint32_t DIM = // ...
int32_t x = // ...

// Operation:
x & (DIM-1u)

Как работает неявное преобразование типов в операторе x & (DIM-1u)?

  • Преобразует ли x в uint32_t?
  • Или от (DIM-1u) до int32_t?
  • Кроме того, каков будет тип результата? Это uint32_t или int32_t

1 Ответ

1 голос
/ 09 июля 2020

Два сценария ios, с учетом того, что 1u является литералом типа unsigned:

  1. unsigned находится в включающем диапазоне от 16 бит до 31 бит. Тип DIM - 1u - uint32_t, а все выражение - uint32_t. Это связано с тем, что тип signed в двоичном выражении, где другим аргументом является тип unsigned, неявно преобразуется в unsigned.

  2. unsigned - 32 бита или больше . Тогда тип DIM - 1u равен unsigned, и то же самое для типа всего выражения.


Наконец, обратите внимание, что стандарт C ++ разрешает unsigned и std::uint32_t быть однотипным; т.е.

std::cout << std::is_same<std::uint32_t, unsigned>::value;

допускается равным 1.

...