Что на самом деле означает предупреждение «Низкая точность в более широком контексте»? - PullRequest
1 голос
/ 26 июля 2010

У меня есть следующий код для встроенной платформы, где int - 16 бит, а long int - 32 бит:

#define MULTIPLIER 0x1000

static void my_function(uint16_t i, void *p)
{
    uint32_t start = MULTIPLIER * i;
    ...
}

Мой компилятор выдает мне предупреждение:

Warning 1 : lower precision in wider context: '*'

для этой строки.

Что это действительно означает?Я могу убрать предупреждение, изменив #define на

#define MULTIPLER 0x1000ul

(явно сделав его длинным без знака), но я хотел бы понять предупреждение.

Ответы [ 3 ]

4 голосов
/ 26 июля 2010

Предупреждает, что умножение будет выполняться с использованием 16-битных значений, а 16-битный результат будет преобразован в 32-битный результат.Это может быть не то, что вы ожидаете (16-битное умножение может быть переполнено), отсюда и предупреждение.

Эта публикация на форуме охватывает проблему

2 голосов
/ 26 июля 2010

Я думаю, что предупреждение означает, что вы, вероятно, хотите получить 32-разрядный результат, но поскольку 0x1000 имеет тип int, а i имеет тип int16_t, выражение имеет тип int и может переполниться.и не даст вам желаемых результатов.

1 голос
/ 26 июля 2010

Для выражения MULTIPLIER * i компилятор выбирает тип большей точности из типов операндов.В первом случае вы даете ему два int с, и это означает, что у вас будет усеченный результат, который после этого будет преобразован в long int, но точность все равно будет 16 бит.

в последнем случае вы явно делаете один из ваших операндов длинным, и результат затем записывается в переменную с той же точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...