[英]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.