Безопасно ли сравнивать (uint32_t) с жестко заданным значением?

Мне нужно делать побитовые операции над 32-битными целыми числами (которые действительно представляют символы, но все что угодно).

Является ли следующий вид кода безопасным?

uint32_t input;
input = ...;

if(input & 0x03000000) {
    output  = 0x40000000;
    output |= (input & 0xFC000000) >> 2;

Я имею в виду, что в операторе "if" я делаю побитовую операцию с левой стороны, над uint32_t и с правой стороны... Я не знаю!

Итак, вы знаете тип и размер (под этим я подразумеваю, сколько байтов он хранится) жестко закодированного "0x03000000"?

Возможно ли, что некоторые системы рассматривают 0x03000000 как int и, следовательно, кодируют его только в 2 байта, что будет катастрофическим?

1 ответ

Решение

Является ли следующий вид кода безопасным?

Да, это.

Итак, вы знаете тип и размер (под этим я подразумеваю, сколько байтов он хранится) жестко закодированного "0x03000000"?

0x03000000 является int в системе с 32-bitint а также long в системе с 16-bitint,

(Как uint32_t присутствует здесь, я предполагаю, что два дополнения и CHAR_BIT из 8, Также я не знаю ни одной системы с 16-bitint а также 64-bitlong.)

Возможно ли, что некоторые системы рассматривают 0x03000000 как int и, следовательно, кодируют его только в 2 байта, что будет катастрофическим?

См выше на 16-bitint система, 0x03000000 это long и является 32-bit, Шестнадцатеричная константа в C - это первый тип, в котором она может быть представлена: int, unsigned int, long, unsigned long, long long, unsigned long long

Другие вопросы по тегам