2014-11-22 192 views
6

我对此并不熟悉,所以我将首先说,当我查看一些代码时,我意识到这个函数对我来说没有一点意义。将unsigned char转换为int并简写为

正如你可以看到这个特定的函数使用位运算符转换4个无符号的字符元素融入整数。

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

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]); 
} 

我已经知道如何按位运算符和炭如何使用1个字节和INT使用4个字节。为什么要将char位移动到左边,而不是将其明确地转换为int将它转换为int? 为什么这个函数需要按位运算符?

这个功能超出了我的理解,请解释一下这个代码,它是如何工作的,或者至少给我一个链接,throughly解释这一点。

我到处寻找解释,但无法找到它。

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

+0

使用operator <<上的类型比INT短自动促进输入到一个int。最终的int投射是不必要的。 – 2014-11-22 02:25:52

回答

6

为什么是必要的这个函数位运算符?

按位运算符用于从四个单字节数字“组合”四字节数字。

比方说,你有4个8位数字,像这样:

aaaaaaaa 
bbbbbbbb 
cccccccc 
dddddddd 

班次给你这样的:

aaaaaaaa000000000000000000000000 
00000000bbbbbbbb0000000000000000 
0000000000000000cccccccc00000000 
000000000000000000000000dddddddd 

位运算符OR让你做一个单一的数字从这四个零件,因为OR-任何位x零产生x。如果对齐四字节号码,如上面所示,仅存在一个非零中的每个位置的位,所以按位OR我国农产品所期望的结果:

aaaaaaaabbbbbbbbccccccccdddddddd 
+0

我试图在评论中总结这个答案,但我不能。很好的答案。 – 2014-11-22 02:18:33

+1

在这种情况下,无符号字符如何移位24,16,8位来获得整数?这没有任何意义。 – Snake 2014-11-22 02:21:20

+0

@Snake:公平的问题。阅读http://en.cppreference.com/w/cpp/language/operator_arithmetic:下的“转换”,然后执行任何其他操作(但在左值到右值转换后(如果适用)),操作数会进行整数提升。 – usr2564301 2014-11-22 02:25:24