gpt4 book ai didi

c++ - 链接提取和插入、包围

转载 作者:行者123 更新时间:2023-12-02 14:37:17 24 4
gpt4 key购买 nike

我尝试尝试这些 iostream 奇怪的行为。

int value = 2;

cout << (value << 2) << endl; //output is 8
cout << (value >> 2) << endl; //output is 0

那么这里发生了什么?

最佳答案

您的困惑是可以理解的!问题在于两个 C++ 运算符 <<>> 的性质。在该语言从 C 发展的早期,这些运算符专门用作所谓的“位移位”运算符,其中 << 会将整数中的值移位给定位数到向左移动,>> 会将位向右移动。因此,对于 16 位整数 2 ,给定 value ,其二进制表示形式为:

0000000000000010

表达式 value << 2 将整数中的所有位向左移动 2 位;任何移出“顶部”(位#15)的位都会丢失,并且右侧创建的“间隙”将用零填充,给出:

0000000000001000

这是数字 8 的二进制表示。

表达式 value >> 2 将所有位向右移动 2 位;右移;任何移出“底部”(位#0)的位都会丢失,并且右侧的间隙将用零填充。因此,在您的情况下,唯一的 1 位丢失(从末尾脱落),并且整个 value 最终为零。

现在,当C++概念出现时,需要运算符符号来输入和输出此类流(无论是字符串流还是< em>file 流,例如代码中的 cout)。选择运算符 <<>> 是因为它们“看起来”像它们实际在做什么(箭头状的运动指示器)。幸运的是,C++ 语言允许对特定类型的变量重新定义任何运算符(这称为“运算符重载”),并且,如果您查看在 <iostream> 标准头中,您将在 ostream 类的定义/声明中看到类似的内容:

ostream& operator<< (int val);
//.. similar lines for types other than int

此“运算符重载”在标准库的源代码中编码为将 val 的格式化版本写入由给定 ostream 对象(如 cout )表示的文件。

请随时要求进一步澄清和/或解释。

PS:作为练习/发人深省:如果从两行代码中删除括号,预计会发生什么?

PPS:关于使用位移运算符乘以或除以 2 的幂:这是一种懒惰的做法,并且在可能发生符号更改时存在潜在危险;特别是对于负数!请参阅 cppreference.com(粗体我的):

For negative a, the behavior of a << b is undefined.

For unsigned a and for signed and non-negative a, the value of a >> b is the integer part of a/2^b.

For negative a, the value of a >> b is implementation-defined (in most implementations, this performs arithmetic right shift, so that the result remains negative).

关于c++ - 链接提取和插入、包围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58799660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com