【发布时间】:2018-12-10 08:48:53
【问题描述】:
如果我们有以下代码:
char x = -1;
x =~x;
在带有 MS VS 编译器(部分支持 C99)的 x86 平台上 - 运行时具体会发生什么?
据我所知,会发生以下情况(如果我错了,请纠正我):
- x 被赋值为 -1,由位模式 0xff 表示,因为 char 由一个字节表示。
- ~ 运算符将 x 提升为 int,也就是说,它在内部使用位模式 0xffffffff。
- ~ 运算符的结果是 0x00000000(int 类型)。
- 为了执行分配,整数提升应用(主要)。因为在我们的例子中,右侧的操作数是一个 int,所以不会发生转换。左侧的操作数转换为 int。分配的结果是 0x00000000。
- 作为副作用,分配的左侧被分配了值 0x00000000。由于 x 是 char 类型,还有另一个隐式转换,将 0x00000000 转换为 0x00。
实际发生的事情太多了——我觉得这有点令人困惑。特别是:我对最后一次隐式转换(从 int 到 char)的理解是否正确?如果作业的结果不能存储在 char 中会怎样?
【问题讨论】:
-
“MS VS 编译器(支持 C99)” - 从什么时候开始?
-
第四个要点中没有整数提升。
int值被分配给char对象。int值将转换为char。分配中没有左侧的转换。 -
据我所知,C99 到 C11 之间的行为没有改变。或者从 C90 开始。
-
@maya 右侧被转换为匹配左侧的类型。左侧未转换。
标签: c type-conversion operators