编译器警告(等级 4)C4463
溢出;将值赋给位字段,该字段只能将值从 low_value 保留到 high_value
分配的值超出了位字段可以容纳的值范围。 带符号位字段类型对符号使用高阶位,因此如果 n 是位字段大小,则带符号位字段的范围为 -2n-1 到 2n-1-1,而无符号位字段的范围为 0 到 2n-1。
示例
此示例生成 C4463,因为它尝试将值 3 分配给大小为 2 的 int
位字段,其范围为 -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.
}