Поделиться через


Предупреждение компилятора (уровень 4) C4463

Переполнения; назначение значения битового поля, которое может содержать только значения из low_value в high_value

Назначенное значение выходит за пределы диапазона значений, которые может хранить битовое поле. Подписанные типы битовых полей используют бит высокого порядка для знака, поэтому если n является размером битового поля, диапазон для подписанных бит-полей равен -2n-1 до 2n-1-1, а необписанные битовые поля имеют диапазон от 0 до 2n-1.

Пример

В этом примере возникает ошибка C4463, так как она пытается назначить значение 3 битовому полю типа int размером 2, которое имеет диапазон от –2 до 1.

Чтобы устранить эту проблему, можно изменить назначенное значение на что-то в допустимом диапазоне. Если битовое поле предназначено для хранения неподписанных значений в диапазоне от 0 до 3, можно изменить тип unsignedобъявления на . Если поле предназначено для хранения значений в диапазоне от -4 до 3, можно изменить размер битового поля на 3.

// C4463_overflow.cpp
// compile with: cl /W4 /EHsc C4463_overflow.cpp
struct S {
    int x : 2; // int type treats high-order bit as sign
};

int main() {
    S s;
    s.x = 3; // warning C4463: overflow; assigning 3
    // to bit-field that can only hold values from -2 to 1
    // To fix, change assigned value to fit in range,
    // increase size of bitfield, and/or change base type
    // to unsigned.
}