按位移位将哪种整数类型用作移位大小?

问题描述

我正在尝试查找有关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意味着在您的示例中,类型为charshort的操作数被提升为int(在正常系统上),而其他未更改。

,

它可以是任何类型:https://en.cppreference.com/w/cpp/language/operator_arithmetic

实际上,编译器将决定如何进行强制转换,并可能使用中间类型。可以保证的是,如果a和b均为正,则

如果a或b为负,则结果是不确定的且取决于实现。

,

标准§8.5.7说:

操作数应为整数或无作用域枚举类型,并且 进行整体促销。结果的类型是 提升的左操作数。如果正确,则行为未定义 操作数为负,或大于或等于 提升后的左操作数。

因此,对我来说,应该提升正确的操作数。这意味着它将被提升为int,unsigned int,long等。您可以根据变量的类型使用不同的规则来阅读整个段落

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...