Компиляция следующего фрагмента с использованием 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'
нет предупреждения
Хотя char не обязательно должен быть 8-битным, это не проблема. Вы конвертируете из signed char
без подписи (uint8_t
), это причина ошибки.
Это:
const int8_t foo[] = {
'\xf2'
};
скомпилирует нормально.
Глядя на мою систему, постоянная \xf2
переполняется, так как находится вне диапазона подписанного символа. Это представляется как -14
который затем неявно преобразуется в unsigned int, давая значение 4294967282. Это затем сужается до char
, выдав это предупреждение:
warning: narrowing conversion of ‘'\37777777762'’
С помощью (unsigned char)'\xf2'
удаляет предупреждение