Указать числовой литерал как 8 бит? - PullRequest
1 голос
/ 26 сентября 2010

<code>unsigned char ascii;
int a = 0;
char string[4] = </code><strike>"foo"</strike><code>; "A1"
ascii = (string[a] - 'A' + 10) * 16;

предупреждение: преобразование в 'unsigned char' из 'int' может изменить его значение

Похоже, что gcc считает символы ичисловые литералы как int по умолчанию.Я знаю, что мог бы просто привести выражение к (без знака), но как я могу указать литералы символов и числовые литералы как 8-битные без приведения?

Аналогичная проблема:

Дробные дроби считаются двойнымипо умолчанию, но они могут быть определены как плавающие:

3.1f

Следовательно, 3.1 будет считаться плавающим, а не двойным.

Ответы [ 3 ]

3 голосов
/ 26 сентября 2010

В C вы не можете выполнять вычисления в чем-либо, меньшем чем int

char a = '8' - '0'; /* '8' is int */
char a = (char)'8' - '0'; /* (char)'8' is converted to `int` before the subtraction */
char a = (char)'8' - (char)'0'; /* both (char)'8' and (char)'0' are converted */
2 голосов
/ 26 сентября 2010

Язык C не предоставляет никакого способа указания литерала с типом char или unsigned char. Используйте актерский состав.

Кстати, результат ваших вычислений находится вне диапазона unsigned char, поэтому предупреждение вполне корректно - конверсия изменит свое значение. C не обеспечивает арифметику в любом типе меньше, чем int. В этом случае я предполагаю, что вам нужна арифметика по модулю 256, и я думаю, что gcc распознает это и не выдаст предупреждение с приведенными приведениями. Но что касается языка Си, этот расчет выполняется более крупным шрифтом, а затем преобразуется в unsigned char для хранения в ascii.

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

Вы можете указать символьные литералы типа charint (char в C ++) с конкретными числами в восьмеричной или шестнадцатеричной записи.Например, \012 - это восьмеричное 12 или десятичное 10. Кроме того, вы можете написать '\x0a', чтобы обозначить то же самое.

Однако, даже если вы это сделали (и расчет не переполнился), оно может не избавиться от предупреждения, так как язык C указывает, что все операнды повышаются до, по крайней мере, int (или unsigned int, в зависимости от типов операндов) до выполнения вычисления.

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