簡體   English   中英

c ++中的位移

[英]Bit shifts in c++

我不明白為什么這給了我同樣的答案:

 long long a = 3265917058 >> 24;
 std::cout << a << std::endl; //194

 long long ip = 3265917058;
 long long b = ip >> 24;
 std::cout << b << std::endl; //194

但這不是:

 long long a = (3265917058 << 16) >> 24;
 std::cout << a << std::endl; //240

 long long ip = 3265917058;
 long long b = (ip << 16) >> 24;
 std::cout << b << std::endl; //12757488 - **i want this to be 240 too!**

更新:我想要32位移位,但是我怎么能移動一個對於int變量來說太大的數字呢? Update2:我的答案是使unsigned int ip。 那一切都會好的。

你的文字常量3265917058是一個int 添加LL后綴以獲得預期的行為(u)r:

long long a = (3265917058LL << 16) >> 24;

3265917058<<16兩邊都是int ,所以操作將在int (32位)中完成。

你需要3265917058LL<<16然后左側將是一個long long ,操作將以該寬度完成,即64位。

得到你要求的:

long long ip=3265917058;
long long b= (static_cast<unsigned int>(ip)<<16)>> 24;
std::cout<<b<<std::endl; // 240

請注意,您將獲得的結果(240)不可移植。 在數學上,結果應該是12757488.值240是由於截斷,並且不能保證這發生。 例如,它不會發生在int為64位的系統上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM