- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解以下迈克的 C 书中摘录中的行“移位的结果与移位的结果具有相同的类型(在积分提升之后)”巴纳汉(Section 2.8.2.3) 。
Importantly, the rules involving mixed types of operands do not apply to the shift operators. The result of the shift has the same type as the thing that got shifted (after the integral promotions), and depends on nothing else.
如果某些东西已经被提升为整数(根据移位运算符使用期间的要求),那么如何将其转换回与原来相同的类型,当然除非它位于赋值的右侧并且是被分配给与整数提升之前相同类型的变量?此外,“涉及混合类型操作数的规则不适用于移位运算符”这句话到底意味着什么?
请阐明问题的两个部分。谢谢。
以下是书中的屏幕截图,分别与使用按位运算符和一般混合表达式期间的提升有关。
最佳答案
这非常简单;移位运算结果的类型是 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;
us
中的值转换为unsigned int
结果是unsigned int
(请注意,以前的值已转换为 signed int
又名 int
)。
ui + ul;
ul + ui;
这两个表达式都转换 ui
到unsigned long long
结果是unsigned long long
。请注意,这些表达式是对称的;结果的类型(实际上,对于 +
运算符,结果的值)并不取决于哪个值位于运算符的左侧,哪个值位于运算符的右侧。
普通操作就到此为止;现在轮类怎么样?
uc << uc;
LHS 转换为 int
通过通常的算术转换,结果是 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 操作数的类型。
这就是你引用的全部意思。
关于你能解释一下这个—"the rules involving mixed types of operands do not apply to the shift operators",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25962388/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎离题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a minim
家庭作业 必须同时重载 operator>(istream &in, Complex &value); public: // constructor Compl
这个问题在这里已经有了答案: What are the basic rules and idioms for operator overloading? (8 个答案) 关闭 5 年前。 有什么区别
这是文档中一个不清楚的示例,使用此运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at 最佳答案 请注
我不明白这种行为: > sort([1,2,3,4]) ~~ sort([1,2,3,4]) False 你能给我解释一下吗? 为什么这两个列表(显然是相等的)根据 Perl 6 不相等。 更新 有趣
我正在尝试将 Ø 设为逻辑否定运算符。 ¬ True; multi sub prefix: ($n) { return not $n; } 当我运行上面的程序时,它返回以下错误: $
class Port { private: char * brand; char style[20]; // i.e., tawny, ruby, vintage int bo
早上好。我有一些问题。我有这些字段: name: "Mike", city: "NY", address: "something", pets: ["dog", "cat"] 我创建了索引 db.pe
我有以下代码使用 Javascript Webcrypto-API 解密 AES 加密数据,但它会导致“OperationError”并显示消息“操作因操作特定原因而失败”: function loa
我制作了一个自定义 Airflow 操作符,这个操作符接受一个输入,这个操作符的输出在 XCOM 上。 我想要实现的是使用一些定义的输入调用运算符,将输出解析为可在分支运算符内部调用的 Python,
int a = 1; a += ++a; cout << a << endl; // 4 int a = 1; a += a++; cout << a << endl; // 3 为什么这两个例子有不
我有这个队列的实现: #include using namespace std; template struct elem_q { T inf; elem_q* link; }; template
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我对 C++ 中的运算符重载有疑问。我有代表复数的结构,我正在重载运算符,所以我可以用复数进行计算。Visual Studio 2012 给我这个错误:1 IntelliSense:没有运算符“!=”
我正在尝试创建一个 BoolArray 类,它表示一个 bool 值数组,而不是为每个 bool 变量保存 1 个 bool 值。它使用 1 个字符变量来表示使用位的 8 个 bool 值,并节省内存
我类有 2 个运算符有点问题。 我的类(class)宣布: template class MyMap{ keyType keys[MAX]; valueType values[MAX
我有类的迭代器模板和用于 for 语句的类。 template class Itr2 { public: Itr2() { } ~Itr2() { } typedef t
Section 7.2 Enumeration declarations 没有说明任何关于 operator!=() 和作用域的 operator==()枚举。但是下面的代码可以编译。 #includ
我需要将一个 int 序列化到本地文件并将其读入内存。这是代码 #include "stdafx.h" #include #include using namespace std; int _tm
operator += 这样定义对吗?! void operator +=(const BigNumber& other) { *this=(*this) + other; } 在这样的类中:
我是一名优秀的程序员,十分优秀!