c++ - 这个函数中char的值是多少?

标签 c++

更新:

在阅读答案时,我觉得我的问题不够明确,对此深表歉意。

令我困惑的是,在第一次调用“disp_binary(sb.ch[1]);”时函数内“u”的值将为 15(这将使它在 if 条件下始终为真,因为它是一个非零值)并且“t”在循环内将始终为真,因为 (t>0)然而输出是:

0 0 0 0 1 1 1 1 

这些零是从哪里来的?输出不应该是:

1 1 1 1 1 1 1 1

因为“u”和“t”在这个调用中总是为真?

对了,整个程序的输出是:

Original bytes:  0 0 0 0 0 0 0 0   0 0 0 0 1 1 1 1 
Exchanged bytes: 0 0 0 0 1 1 1 1   0 0 0 0 0 0 0 0 

我在从一本书上学习 C++ 中的 union ,遇到了一个我无法理解的示例。

我理解 union 的基本思想,我在例子中没有得到的东西(见下面的例子)是“void disp_binary(unsigned u)”函数,更具体地说,“u”的值是多少正在传递给函数? sb.ch[1] 不是 15 而 sb.ch[0] 不是 0 吗?因为我很困惑为什么我们在 if 语句的条件中使用“u”?

这是例子:

// Use a union to exchange the bytes within a short integer.
#include <iostream>
using namespace std;

void disp_binary(unsigned u);

union swap_bytes {
short int num;
char ch[2];
};

int main()
{
swap_bytes sb;
char temp;

sb.num = 15;  // binary: 0000 0000 0000 1111


 cout << "Original bytes:  ";
 disp_binary(sb.ch[1]);
 cout << "  ";
 disp_binary(sb.ch[0]);
 cout << "\n\n";


// exchange the bytes
temp = sb.ch[0];
sb.ch[0] = sb.ch[1];
sb.ch[1] = temp;

 cout << "Exchanged bytes: ";
 disp_binary(sb.ch[1]);
 cout << "  ";
 disp_binary(sb.ch[0]);
 cout << "\n\n";

 return 0;
 }

// Display the bits within a byte.
void disp_binary(unsigned u)
{
register int t;

for(t=128; t>0; t=t/2)
if(u & t) cout << "1 ";
else cout << "0 ";
}

最佳答案

根据 C++ 标准,这是一个灰色区域,可以在写入另一个字段后获得 union 字段的值。 从技术上讲,从一个从未被初始化并且是 UB 的 union 领域读取。 union 字段是不同对象。由于历史原因,大多数编译器允许通过 union 进行类型双关,即使它是 C++ 标准中定义的 UB。建议尽可能避免使用它。这里出现的一个问题是一个字段是短的,而另一个是两个字节,一些平台将无法在写入短的内存中寻址单独的字节。结果可能取决于系统的字节顺序,例如 GCC 更改字节顺序以在小端和大端平台上允许相同的结果(tada,您不能通过 union 测试系统的字节顺序)。

关于您的相关功能

void disp_binary(unsigned u)
{
   register int t;

    for(t=128; t>0; t=t/2)
      if(u & t) 
          cout << "1 ";
      else
          cout << "0 ";
}

& 不是逻辑( bool )运算,它是二进制(按位)运算。设u等于15,t等于8,运算结果为

00001111 & 00001000 = 00001000。

该值将被转换为 bool 值。

事实上,关键字 register 不再有任何意义,您可以简化代码,通过强制转换摆脱 fork 的 if()。

   void disp_binary(unsigned u)
   { 
        for(unsigned t = 128; t>0; t=t>>1)
        {
           std::cout << int(bool(u & t)) << " ";
        }
    }

可以使用 C++ 库的 std::bitset 类代替这个。

关于c++ - 这个函数中char的值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158975/

相关文章:

c++ - protected 继承的实际用途是什么?

c# - 以编程方式清理 Windows 缩略图缓存

c++ - 如果标准指定它有一个析构函数,类应该不是可简单破坏的吗?

c++ - 为什么编译器会忽略模板类中的结构元素?

c++ - QWebPage 在第一次加载后不工作

c++ - 使用指针的二维数组的非访问冲突

c++ - 编译器错误 : looser throw specifier for destuctor

c++ - 在图像 OpenCV 上写非常小的字符?

c++ - C++中的链表代码

c++ - 为什么1个元素的数组允许2k个元素?