2011-01-20 57 views
5

我不明白爲什麼這給了我同樣的答案:位移位

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位的轉變,但如何能我32位移位數字對於一個int變量來說太大了? Update2:我的答案是使unsigned int ip。然後一切都會好的。

回答

7

你的文字常數3265917058是一個int。添加一個後綴LL得到預期的behavio(U)R:

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

但我如何得到答案240如果我使用變量?我無法將3265917058存儲在int中。 – Stals 2011-01-20 12:31:43

2

3265917058<<16雙方都int,所以操作將在int(32位)來完成。

您需要3265917058LL<<16,那麼左側將是long long並且將以該寬度(即64位)完成操作。

1

爲了讓你問什麼:

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位的系統上。