我的任务是将这个C ++代码移植到Java上。使用Java比使用C ++要好得多。我在很大程度上理解了位移,但是我并不真正理解unsigned long值在这种情况下的作用。
这在Java中会是什么样的?
#include <iostream>
using namespace std;
int main() {
short netSpeed = 3;
cout << "netSpeed before: " << netSpeed << endl;
netSpeed = 1UL << netSpeed;
cout << "netSpeed after: " << netSpeed << endl;
return 0;
}
答案 0 :(得分:3)
C ++开发人员没有采用平台表示有符号整数类型的机会,这可能是1或2的补码。由于积分值1的溢出可能会小到16位int
,它们也会防止未定义的行为。
使用1UL让他们放心,转移的结果将是0b1000。 UL
强制编译器使用unsigned long
类型。
实际上在这种情况下它是多余的,并且考虑到Java 始终使用2的补码作为整数类型(除了char
类型之外它们都是有符号的),它非常安全您可以在Java端口中编写1 << netSpeed
。
答案 1 :(得分:-2)
这是您的代码从C ++到Java的确切转换:
class Speed {
public static void main(String args[]) {
short netSpeed = 3;
System.out.println("netSpeed before: "+netSpeed);
netSpeed = (short) (1 << netSpeed);
System.out.println("netSpeed after: "+netSpeed);
}
}