0

我无法理解Mike Banahan 的 C 书(第 2.8.2.3 节)的以下摘录中的“移位的结果与被移位的事物具有相同的类型(在积分提升之后)”这一行。

重要的是,涉及混合类型操作数的规则不适用于移位运算符。转移的结果与转移的东西具有相同的类型(在积分提升之后),并且不依赖于其他任何东西。

如果某些东西已经被提升为整数(在使用移位运算符期间需要),那么如何将它转换回与原来相同的类型,除非它当然位于赋值的右侧并且被分配给与整数提升之前类型相同的变量?此外,“涉及混合类型操作数的规则不适用于移位运算符”这一行究竟意味着什么?

请阐明问题的两个部分。谢谢你。

以下是本书的截图,分别与使用按位运算符和一般混合表达式期间的提升有关。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

这很简单。移位运算结果的类型是 LHS 操作数的类型。对于大多数二元运算符,结果同时基于 LHS 和 RHS 操作数,但移位运算符不同。

unsigned char      uc = 0x08;
unsigned short     us = 0x0008;
unsigned int       ui = 0x00000008;
unsigned long long ul = 0x0000000000000008;

(我假设sizeof(unsigned int) == 4这个答案。如果不同,细节必须改变,但概念保持不变。)

现在考虑一些表达式:

uc + uc;

两种类型都转换为int,结果为int.

us + us;

同样,两种类型都转换为int,结果为int.

us + ui;
ui + us;

in 的值us被转换为unsigned int,结果为unsigned int(注意之前的值被转换为signed intaka int)。

ui + ul;
ul + ui;

这两个表达式都转换ui为 anunsigned long long并且结果是unsigned long long。请注意,这些表达式是对称的;结果的类型(实际上,对于+运算符,结果的值)不取决于哪个值在 LHS 上,哪个在运算符的 RHS 上。

普通操作就这么多;现在轮班呢?

uc << uc;

LHSint通过通常的算术转换转换为int.

us << us;

这个结果也是一个int

ui << ui;

这个结果是一个unsigned int

ul << ul;

这个结果是一个unsigned long long。但是混合类型呢?

uc << ul;   // Result: int
ul << uc;   // Result: unsigned long long
us << ui;   // Result: int
ui << us;   // Result: unsigned int
ui << ul;   // Result: unsigned int
ul << ui;   // Result: unsigned long long

LHS 操作数的提升类型控制结果的类型。对于比 短的类型int,结果是int; 对于其他类型,类型是 LHS 操作数的类型。

这就是你引用的全部意思。

于 2014-09-21T21:54:18.873 回答