问题描述
我正在尝试查找有关C ++中shift大小类型的信息。例如:
int x = 1;
char char_var = 1;
short short_var = 1;
int int_var = 1;
long long_var = 1;
long long long_long_var = 1;
x = x << char_var; // works
x = x << short_var; // works
x = x << int_var; // works
x = x << long_var; // works
x = x << long_long_var; // works
那么C ++使用哪种类型的移位大小?
解决方法
在[expr.shift] / 1中进行了解释:(N4860)
操作数应为整数或无范围枚举类型,并执行整数提升
与大多数其他二进制运算符不同,不会执行通常的算术转换。 integral promotions意味着在您的示例中,类型为char
和short
的操作数被提升为int
(在正常系统上),而其他未更改。
它可以是任何类型:https://en.cppreference.com/w/cpp/language/operator_arithmetic
实际上,编译器将决定如何进行强制转换,并可能使用中间类型。可以保证的是,如果a和b均为正,则
如果a或b为负,则结果是不确定的且取决于实现。
,标准§8.5.7说:
操作数应为整数或无作用域枚举类型,并且 进行整体促销。结果的类型是 提升的左操作数。如果正确,则行为未定义 操作数为负,或大于或等于 提升后的左操作数。
因此,对我来说,应该提升正确的操作数。这意味着它将被提升为int,unsigned int,long等。您可以根据变量的类型使用不同的规则来阅读整个段落