Является ли целочисленный константный тип по умолчанию подписанным или без знака?
Является ли целочисленный константный тип по умолчанию подписанным или неподписанным? например 0x80000000, как я могу решить использовать его в качестве целочисленной константы со знаком или без целого целого без каких-либо суффиксов?
Если это целочисленная константа со знаком, как объяснить следующий случай?
printf("0x80000000>>3 : %x\n", 0x80000000>>3);
выход:
0x80000000>>3 : 10000000
В приведенном ниже примере можно указать, что моя платформа использует арифметический побитовый сдвиг, а не логический побитовый сдвиг:
int n = 0x80000000;
printf("n>>3: %x\n", n>>3);
выход:
n>>3: f0000000
Ответы
Ответ 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.
Еще одна вещь, которую следует учитывать, заключается в том, что поведение правого смены зависит от платформы. На некоторых платформах это сохранение знака (арифметика), а на некоторых платформах это простой побитовый сдвиг (логический).