赋值有更多位然后是左值

the*_*dal 5 c c++ struct bit-manipulation compilation

只是出于好奇.我想知道当左值小于指定值时会发生什么.

char a = 0xffffFFFF
Run Code Online (Sandbox Code Playgroud)

让我们说吧

struct {
int num:3;
}testStruct;

testStruct.num = 0xffffFFFF/2 -1;
Run Code Online (Sandbox Code Playgroud)

char(第一种情况)和3位整数(第二种情况)中的值是多少

M.M*_*M.M 6

您错误地使用了术语"左值".我猜你的意思是"变量"或"对象".

在case sizeof(0xFFFFFFFF) == 1和plain char中unsigned,则char a = 0xffffFFFF;很简单,因为该值可以表示为char.

在其他情况下,它是超出范围的转换.如果普通字符是无符号的,那么这意味着大的正数0xFFFFFFFF被模数调整UCHAR_MAX+1为适合(在普通系统上,普通字符得到255).

如果plain char被签名则它是实现定义的行为(并且在C中,可能引发实现​​定义的信号).最常见的实现定义是2的补码截断,它将赋予char值,-1但这不能保证.


移动到位域.0xffffFFFF/2 - 10x7FFFFFFE.这被分配给类型int和宽度的位域3,它请求超出范围的转换,就像签名的char情况一样.和以前一样,这是实现定义的(并且可能在C中引发实现定义的信号).

查看你的编译器文档,找出它在这里指定的内容,虽然我再次期望它会使用2的补码截断,给出-2.

  • 好答案.你没假设char是8位.只是`sizeof(char)= 1`. (2认同)