Шестнадцатеричная константа в C без знака, хотя суффикс L - PullRequest
8 голосов
/ 18 июля 2011

Я знаю, что это простой вопрос, но я в замешательстве. У меня довольно типичное предупреждение gcc, которое обычно легко исправить:
warning: comparison between signed and unsigned integer expressions

Всякий раз, когда у меня есть шестнадцатеричная константа с самым старшим битом, например 0x80000000L, компилятор интерпретирует ее как беззнаковый. Например, компиляция этого кода с -Wextra вызовет предупреждение (gcc 4.4x, 4.5x):

int main()
{
long test = 1;
long *p = &test;
if(*p != 0x80000000L) printf("test");
}

Я специально указывал суффикс константы так долго, так почему это происходит?

Ответы [ 5 ]

12 голосов
/ 18 июля 2011

Ответ на Беззнаковая шестнадцатеричная константа в C? актуальна. Шестнадцатеричная константа с суффиксом L будет иметь первый из следующих типов, которые могут содержать ее значение:

long
unsigned long
long long
unsigned long long

Подробнее см. C99 , раздел [6.4.4.1].

На вашей платформе long - это, вероятно, 32 бита, поэтому он недостаточно велик, чтобы содержать (положительную) константу 0x80000000. Таким образом, ваша константа имеет тип unsigned long, который является следующим типом в списке и достаточен для хранения значения.

На платформе, где long был 64 бит, ваша константа будет иметь тип long.

1 голос
/ 18 июля 2011

Поскольку ваш компилятор использует 32-разрядные long с (и, вероятно, также 32-разрядные int с) и 0x80000000 не поместятся в 32-разрядное целое число со знаком, поэтому компилятор интерпретирует его как беззнаковое. Как обойти это, зависит от того, что вы пытаетесь сделать.

0 голосов
/ 18 июля 2011

Шестнадцатеричные константы в C / C ++ всегда без знака.Но вы можете использовать явное приведение типа для подавления предупреждения.

0 голосов
/ 18 июля 2011

Тогда без знака долго.Я предполагаю, что компилятор решит, что такой шестнадцатеричный литерал, скорее всего, желательно, чтобы он был без знака.Попробуйте разыграть его (unsigned long)0x80000000L

0 голосов
/ 18 июля 2011

Согласно стандарту c шестнадцатеричные константы являются беззнаковыми.

...