Как я могу исправить причину этого предупреждения компилятора? - PullRequest
1 голос
/ 08 сентября 2010

Следующий код выдает предупреждение при компиляции на 32-битных системах: 1087: warning: integer constant is too large for "long" type; Как я могу это исправить, чтобы я не получил это предупреждение, и оно работает правильно на 32-разрядных?

Допустимое значение для этого:

unsigned char str[] = "\x00\x17\x7c\x3a\x67\x4e\xcb\x01";

и функция mypow возвращает long без знака.

     unsigned long long high, low, nano;
     high = // line 1087
         (str[7]&0xff) * mypow(2,56) +
         (str[6]&0xff) * mypow(2,48) +
         (str[5]&0xff) * mypow(2,40) +
         (str[4]&0xff) * mypow(2, 32);
     low =
         (str[3]&0xff) * mypow(2,24) +
         (str[2]&0xff) * mypow(2,16) +
         (str[1]&0xff) * mypow(2,8) +
         (str[0]&0xff);
     nano = ((high + low)/10000000) - (unsigned long long)11644473600;
     return localtime((time_t*)&nano);

Ответы [ 6 ]

6 голосов
/ 08 сентября 2010

Если вы используете в своем коде константу, которая не помещается внутри 32 битов, добавьте LL в ее конец, чтобы компилятор знал, что это должен быть тип long long.Например, константа в конце строки nano = должна быть 11644473600LL.Текущий код преобразует константу в long long, но сама константа является регулярной long, поскольку не существует явного суффикса LL.

2 голосов
/ 08 сентября 2010

Наиболее вероятный правильный ответ на ваш вопрос заключается в том, что вы должны использовать свой компилятор C в режиме C89 / 90 (или, возможно, в режиме C ++?).И в C89 / 90, и в C ++ самый большой целочисленный тип - long.На этих языках нет такого типа как long long.Тем не менее, некоторые компиляторы поддерживают long long как нестандартное расширение.Когда вы используете в коде константу, которая слишком велика для типа long, компилятор должен либо отклонить ваш код, либо преобразовать константу в нестандартный тип long long.В последнем случае выдается предупреждение, чтобы информировать вас о том, что нестандартный тип неявно вводится в ваш код.

Хотя решение с суффиксом LL или ULL может работать для подавления предупрежденияЕсли вы действительно хотите использовать тип long long в своем коде, я все равно рекомендую вам скомпилировать код в режиме C99, где этот тип является стандартным.В режиме C99 предупреждение должно исчезнуть само по себе, независимо от суффиксов.

2 голосов
/ 08 сентября 2010

Я считаю, что вам нужно сделать 11644473600ULL

2 голосов
/ 08 сентября 2010

Он считает 1000000 32-битным значением.Будьте откровенны, так как long:

nano = ((high + low)/10000000L) - 11644473600L;

EDIT: ULL будет правильным суффиксом.

1 голос
/ 08 сентября 2010

вы должны использовать stdint.h определенные целочисленные типы для межплатформенной переносимости.

например, вы должны попробовать использовать uint64_t вместо unsigned long long.Таким образом, вы точно знаете, сколько битов вы получаете, и это одинаково на всех платформах.

0 голосов
/ 08 сентября 2010

Используйте -std=c99 в командной строке gcc, и предупреждение исчезнет, ​​поскольку C99 имеет четко определенное поведение для целочисленных констант, таких больших.

...