Сужение преобразования из char в uint8_t

Компиляция следующего фрагмента с использованием C ++ 11 (демо Вот):

#include <stdint.h>

int main() {
const uint8_t foo[] = {
'\xf2'
};
}

Сработает предупреждение (по крайней мере, в GCC 4.7), указывающее, что при конвертации происходит сужающееся преобразование '\xf2' в uint8_t,

Почему это? sizeof(char) всегда 1, который должен быть таким же, как sizeof(uint8_t)не так ли?

Обратите внимание, что при использовании других символьных литералов, таких как '\x02'нет предупреждения

2

Решение

Хотя char не обязательно должен быть 8-битным, это не проблема. Вы конвертируете из signed char без подписи (uint8_t), это причина ошибки.

Это:

const int8_t foo[] = {
'\xf2'
};

скомпилирует нормально.

5

Другие решения

Глядя на мою систему, постоянная \xf2 переполняется, так как находится вне диапазона подписанного символа. Это представляется как -14 который затем неявно преобразуется в unsigned int, давая значение 4294967282. Это затем сужается до char, выдав это предупреждение:

warning: narrowing conversion of ‘'\37777777762'’

С помощью (unsigned char)'\xf2' удаляет предупреждение

3

По вопросам рекламы [email protected]