【问题标题】:Converting unsigned char to int and short将 unsigned char 转换为 int 和 short
【发布时间】:2015-01-20 07:15:51
【问题描述】:

我是新手,所以我首先要说的是,当我查看一些代码时,我意识到这个函数对我来说没有一点意义。

如您所见,此特定函数使用位运算符将 4 个无符号字符元素转换为整数。

//将一个四字符数组转换为整数,使用little-endian形式

int toInt(const char* bytes) {
    return (int)(((unsigned char)bytes[3] << 24) |
                 ((unsigned char)bytes[2] << 16) |
                 ((unsigned char)bytes[1] << 8) |
                 (unsigned char)bytes[0]);
}

short toShort(const char* bytes) {
    return (short)(((unsigned char)bytes[1] << 8) |
                   (unsigned char)bytes[0]);
}

我已经知道按位运算符以及 char 如何使用 1 个字节,而 int 如何使用 4 个字节。为什么要将 char 位向左移动 24 位,而不是将其显式转换为 int 将其转换为 int? 为什么这个函数需要位运算符?

这个功能超出了我的理解范围,请解释一下这段代码以及它是如何工作的,或者至少给我一个链接来彻底解释这一点。

我到处寻找解释,但找不到。

这可能有一个足够简单的解释。

【问题讨论】:

  • 在比 int 短的类型上使用运算符

标签: c++ arrays char int


【解决方案1】:

为什么这个函数需要位运算符?

位运算符用于将四个单字节数字“组装”成四字节数字。

假设您有四个 8 位数字,如下所示:

aaaaaaaa
bbbbbbbb
cccccccc
dddddddd

轮班给你这个:

aaaaaaaa000000000000000000000000
00000000bbbbbbbb0000000000000000
0000000000000000cccccccc00000000
000000000000000000000000dddddddd

按位运算符OR 让您可以从这四个部分中生成一个数字,因为OR-ing 任何位x 带有零会产生x。如果像上图那样对齐四字节数字,每个位置只有一个非零位,因此按位ORs 会产生所需的结果:

aaaaaaaabbbbbbbbccccccccdddddddd

【讨论】:

  • 我试图在评论中总结这个答案,但我做不到。很好的答案。
  • 在这种情况下,无符号字符如何移动 24、16、8 位以获得整数?这没有任何意义。
  • @Snake:公平的问题。阅读en.cppreference.com/w/cpp/language/operator_arithmetic 下的“转换”:“在任何其他操作之前(但在左值到右值转换后,如果适用),操作数会进行整数提升。”
  • @Snake 这是因为 C 中的积分运算提升规则。&lt;&lt; 在工作之前总是将两个操作数提升到至少 int
  • @Snake 这是一个很好的观点:移位是一个整数运算,所以它在移位之前将其操作数转换为int,因此八位aaaaaaaa 在移位之前变为000000000000000000000000aaaaaaaa
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多