c ++中的位移

时间:2011-01-20 12:25:48

标签: c++ bit-shift

我不明白为什么这给了我同样的答案:

 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。一切都会好的。

3 个答案:

答案 0 :(得分:7)

您的文字常量3265917058int。添加LL后缀以获得预期的行为(u)r:

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

答案 1 :(得分:2)

3265917058<<16双方均为int,因此操作将在int(32位)中完成。

您需要3265917058LL<<16,然后左侧将是long long,操作将以该宽度完成,即64位。

答案 2 :(得分: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位的系统上。