我在某处读取按位移动自动将操作数转换为int。但我不确定该声明是否应该以“如果操作数是不平等类型”来限定。位移是否自动将字符提升为int?
char one = 1, bitsInType = 8;
one << (bitsInType - one);
第二行的默认结果是int还是char?
我在某处读取按位移动自动将操作数转换为int。但我不确定该声明是否应该以“如果操作数是不平等类型”来限定。位移是否自动将字符提升为int?
char one = 1, bitsInType = 8;
one << (bitsInType - one);
第二行的默认结果是int还是char?
在正常的C实现中,结果类型为int
。
根据C 2011(N1570)6.5.7,“对每个操作数执行整数提升。 “
根据6.3.1.1 2,整数升级为,对于整数类型的对象或表达式,排名小于或等于秩为int和unsigned int:“如果int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int;否则,它是在堆栈溢出转换为无符号整型。”
已经有讨论别处从它似乎一个奇异C实现可以具有相同的宽度的char
为int
,这会导致一些不寻常的行为。
C11标准,部分6.5.7按位的移位运算符,指出:
整数优惠在每个操作数的执行。结果的类型是 升级左操作数的类型。
这意味着值被转换为int
然后执行操作;你表达的结果是int
。
@MarkRansom:我不认为这是一个很好的重复。这个问题解决了通常的算术转换不被执行的事实。这个问题解决了整数升级被执行的事实。 –