C:如果x是char类型,x = ~x会发生什么(详细)?

may*_*aya 4 c operators type-conversion

如果我们有以下代码:

char x = -1;
x =~x;
Run Code Online (Sandbox Code Playgroud)

在带有MS VS编译器的x86平台上(部分支持C99) - 运行时会发生什么?

据我所知,发生以下情况(如果我错了请纠正我):

  • x被赋值-1,由位模式0xff表示,因为char由一个字节表示.
  • 〜运算符将x提升为int,也就是说,它在内部使用位模式0xffffffff.
  • 〜运算符的结果是0x00000000(类型为int).
  • 要执行分配,整数促销适用(主要).因为在我们的例子中,右侧的操作数是一个int,所以不会发生转换.左侧的操作数转换为int.赋值的结果是0x00000000.
  • 作为副作用,赋值的左侧被赋值为0x00000000.由于x是char类型,因此还有另一个隐式转换,它将0x00000000转换为0x00.

实际上发生了很多事情 - 我发现它有点令人困惑.特别是:我对最后一次隐式转换(int到char)的理解是否正确?如果赋值的结果无法存储在char中会发生什么?

Bat*_*eba 7

确实~x是一种int类型.

char如果char是,那么转换回定义很明确unsigned.当然,如果值在支持的范围内,它也是明确定义的char.

如果charsigned,则转换为~xto char是实现定义的,可能会引发实现定义的信号.

在你的情况下,你有一个2的补码int和2的补码平台char,所以~x被观察为0.

请注意,MSVC并不完全支持任何 C标准,也没有声称.