C++ 为什么位字段在赋值后仍存储负数?

C++ 为什么位字段在赋值后仍存储负数?,c++,unsigned,signed,bit-fields,C++,Unsigned,Signed,Bit Fields,在下面的代码中 #include<iostream> using namespace std; struct abc{ int x:4; } m; int main(){ m.x = 8; cout<<m.x; } #包括 使用名称空间std; 结构abc{ INTX:4; }m; int main(){ m、 x=8; coutYour程序通过整数溢出显示未定义的行为。4位有符号类型的位字段可以表示16个不同的值,整数-8到7(假设典型的2

在下面的代码中

#include<iostream>
using namespace std;
struct abc{
    int x:4;
} m;
int main(){
    m.x = 8;
    cout<<m.x;  
}
#包括
使用名称空间std;
结构abc{
INTX:4;
}m;
int main(){
m、 x=8;

coutYour程序通过整数溢出显示未定义的行为。4位有符号类型的位字段可以表示16个不同的值,整数-8到7(假设典型的2的补码表示).8不适用于带符号的4位整数。负零始终是一个有趣的概念。@IgorTandetnik谢谢我得到了它。当我输入8时,它超出了限制并跳回其最低值-8,如果我输入9,它将跳回-7。谢谢我现在得到了它。@Igor Tandetnik:行为是实现定义的,而不是未定义的。整数assi溢出GnEnter一直是C++中实现的。整数溢出导致算术中的未定义行为,但在赋值或转换中不存在。您的程序表现为未定义的行为,通过积分溢出。4位有符号类型的位字段可以表示16个不同的值,整数- 8到7。(假设典型的2的补码表示).8不适用于带符号的4位整数。负零始终是一个有趣的概念。@IgorTandetnik谢谢我得到了它。当我输入8时,它超出了限制并跳回其最低值-8,如果我输入9,它将跳回-7。谢谢我现在得到了它。@Igor Tandetnik:行为是实现定义的,而不是未定义的。整数assi溢出GNEATE一直是C++中实现的。整数溢出导致算术中的未定义行为,而不是赋值或转换。