简体   繁体   中英

Bit shifts in c++

I don't understand why this gives me the same answer:

 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

but this don't:

 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!**

Update: I want 32bit shift , but how can i 32bit shift a number that is too large for an int variable? Update2: My answer is to make unsigned int ip. Then everything will be ok.

Your literal constant 3265917058 is an int . Add a LL suffix to get the expected behavio(u)r:

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

3265917058<<16 both sides are int , so the operation will be done in int (32-bits).

You need 3265917058LL<<16 then the left-side will be a long long and the operation will be done with that width ie 64-bits.

To get what you ask for:

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

Note that the result you will get (240) is not portable. Mathematically, the result should be 12757488. The value 240 is due to truncation, and this is not guaranteed to happen. For instance, it doesn't happen on systems where int is 64 bits.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM