将无符号字符转换为 int 和 short
Converting unsigned char to int and short
我是新手,所以我首先要说的是,当我查看一些代码时,我意识到这个函数对我来说没有一点意义。
如您所见,此特定函数使用按位运算符将 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
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 从“ int”到'int16_t {aka short int}'内部{}的“((int)a) -1)”的缩小转换
- 如果超过 short int(c++) 的最大值会发生什么
- C++ 中有符号 int 和无符号 short 的比较
- Short Int基掩码在C 库子弹中的工作方式
- 为什么C/C++会自动将char/wchar_t/short/bool/enum类型转换为int
- 为什么编译器将"char"与"int"匹配而不是"short"?
- 为什么 foo(short int *) 和 bar(signed short *) 认为 QT 的签名不同
- 错误:从 'short unsigned int*' 到"短无符号 int"的转换无效|(在 C++ 中)
- wchar_t*到short int的转换
- 将无符号short/int强制转换为char*
- 像javashort[]一样在c中创建short int数组
- C/C++:在32位机器上的sizeof(short)、sizeof(int)、sizeof(long)、size of
- 对'icu_56::UnicodeString::UnicodeString(signed char, unsigned short const*, int)' 的未定义引用
- 将无符号字符转换为 int 和 short
- gcc 奇怪的转换警告(<B>从"int"转换为"A::count_type {aka short unsigned int}"可能会改变其值)
- 对类中的整数成员变量使用short、int或long
- 让template通过指定bitsize在char/short/int之间进行选择
- 是实现定义的unsigned short + int类型
- 为什么在C和c++中进行算术运算之前必须将short类型转换为int类型?