如何解决按位移位将哪种整数类型用作移位大小?
我正在尝试查找有关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等。您可以根据变量的类型使用不同的规则来阅读整个段落
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。