Является ли целочисленный константный тип по умолчанию подписанным или без знака? - программирование

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

Является ли целочисленный константный тип по умолчанию подписанным или неподписанным? например 0x80000000, как я могу решить использовать его в качестве целочисленной константы со знаком или без целого целого без каких-либо суффиксов?

Если это целочисленная константа со знаком, как объяснить следующий случай?

printf("0x80000000>>3 : %x\n", 0x80000000>>3);

выход:

0x80000000>>3 : 10000000

В приведенном ниже примере можно указать, что моя платформа использует арифметический побитовый сдвиг, а не логический побитовый сдвиг:

int n = 0x80000000;

printf("n>>3: %x\n", n>>3);

выход:

n>>3: f0000000
4b9b3361

Ответ 1

C имеет разные правила для десятичных, восьмеричных и шестнадцатеричных констант.

Для десятичного числа это первый тип, который может вставить значение: int, long, long long

В шестнадцатеричном виде это первый тип, который может вставить значение: int, unsigned int, long, unsigned long, long long, unsigned long long

Например, в системе с 32-bit int и unsigned int: 0x80000000 есть unsigned int.

Обратите внимание, что для десятичных констант C90 имеет разные правила (но правила не изменялись для шестнадцатеричных констант).

Ответ 2

Подписан , если он соответствует значению целого числа. Чтобы сделать это без знака, добавьте суффикс u, например. 1234u.

Вы можете преобразовать знаковое значение в unsigned, назначив ему неподписанную переменную.

unsigned int i = 1234u; // no conversion needed
unsigned int i = 1234;  // signed value 1234 now converted to unsigned

Для 0x80000000 он будет без знака, если ints 32 бита на вашей платформе, так как он не вписывается в подписанный int.


Еще одна вещь, которую следует учитывать, заключается в том, что поведение правого смены зависит от платформы. На некоторых платформах это сохранение знака (арифметика), а на некоторых платформах это простой побитовый сдвиг (логический).