将无符号字符转换为 int 和 short

Converting unsigned char to int and short

本文关键字:int short 转换 无符号 字符      更新时间:2023-10-16

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

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

使用小端形式将四个字符的数组转换为整数

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 个字节。为什么将字符位向左移动 24 位,而不仅仅是将其显式转换为 int 将其转换为 int?为什么此函数需要按位运算符?

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

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

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

为什么此函数需要按位运算符?

按位运算符用于从四个单字节数字"组装"四字节数字。

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

aaaaaaaa
bbbbbbbb
cccccccc
dddddddd

班次为您提供:

aaaaaaaa000000000000000000000000
00000000bbbbbbbb0000000000000000
0000000000000000cccccccc00000000
000000000000000000000000dddddddd

按位运算符OR允许您从这四个部分生成单个数字,因为OR -ing 任何带有零的位x都会产生x。如果如图所示对齐四字节数字,则每个位置只有一个非零位,因此按位OR会产生所需的结果:

aaaaaaaabbbbbbbbccccccccdddddddd