[英]Inconsistent results converting unsigned [char, short, int, long] to double
[英]Converting unsigned char to int and short
我是新手,所以我首先要說的是,當我查看一些代碼時,我意識到這個功能對我來說沒有任何意義。
如您所見,此特定函數使用按位運算符將4個unsigned char元素轉換為整數。
//使用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? 為什么這個函數需要按位運算符?
這個功能超出了我的理解范圍,請解釋這段代碼以及它是如何工作的,或者至少給我一個能夠徹底解釋這個問題的鏈接。
我到處尋找解釋但找不到它。
這可能有一個簡單的解釋。
為什么這個函數需要按位運算符?
按位運算符用於從四個單字節數“組合”四字節數。
假設您有四個8位數字,如下所示:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
轉移給你這個:
aaaaaaaa000000000000000000000000
00000000bbbbbbbb0000000000000000
0000000000000000cccccccc00000000
000000000000000000000000dddddddd
按位運算符OR
允許您從這四個部分中生成一個數字,因為將任何位x
與零進行OR
會產生x
。 如果對齊如上所示的四字節數字,則每個位置只有一個非零位,因此按位OR
產生所需的結果:
aaaaaaaabbbbbbbbccccccccdddddddd
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.