我引用赫伯特·席尔特的话:JAVA,完整参考第8版。
第4章:运算符
当您移动字节和短值时,Java的自动类型提升会产生意外的结果。如您所知,在计算表达式时,字节值和短值将提升为int。此外,这样一个表达式的结果也是一个int。这意味着,字节值或短值左移的结果将是int,并且左移的位不会丢失,直到它们移过位位置31。
此外,当提升为int时,负的字节值或短值将进行符号扩展。因此,高阶位将用1填充。由于这些原因,对字节或short执行左移位意味着您必须放弃int结果的高阶字节。例如,如果左移字节值,则必须先将该值提升为int,然后再进行移位。这意味着如果需要的是移位字节值的结果,则必须丢弃结果的第一个3字节。最简单的方法是将结果转换回字节。
byte a = 64, b;
int i;
i = a << 2;
b = (byte)(a<<2);
"Binary Equivalent of b : "+Integer.toBinaryString(b); // gives 0
byte i1 = -5,i2;
int s;
s = i1<<2;
i2 = (byte)(i1<<2);
Integer.toBinaryString(i2); //gives 11111111111111111111111111101100 WHY?
我已声明i2属于字节。因此,它应该包含8位(一个字节)。为什么是32位。结果的顶部是否需要丢弃3个字节。这只发生在负数的情况下(此处为-5)。64时不会发生。请提出建议。
i2的值(二进制)为1110 1100,或(十进制)为-20。
整数的参数类型。toBinaryString(int)是int
,因此i2
被提升为int
。这涉及到符号扩展,这意味着“符号位”(负数的前导1
,或正数或零的前导
0
)被复制到所有更高的位,产生(二进制)1111 1111 1111 1111 1111 1110 1100或(十进制)20
。
当您查看二进制表示时,这可能看起来很奇怪,但当您查看十进制表示时,这是有意义的。符号扩展的目的是保留实际的数值。
平台:Linux 3.2.0 x86(Debian 7.1) 编译器:GCC 4.7.2(Debian 4.7.2-5) 我正在编写一个整数到字符串的转换函数,该函数接受参数的整数值(基数)。整数参数(基数)的有效范围非常小(2-36),小于字符的最大大小。所以我想把参数声明为char,但我必须用所说的参数乘以long-long int,我想知道这到底是怎么回事。我不想将参数声明为char,如果这
问题内容: Java中是否像C ++中一样有变量类型? 一个例子: 我知道Java中有一个增强的for循环,但是有自动吗?如果不是,是否有这样做的技巧?我指的是C ++ 11中的新功能 问题答案: 在问题被 编辑 之前回答: 不,Java中没有变量类型。可以通过以下方式实现相同的循环: Java具有局部变量,其范围在定义它们的块内。 _与C和C 类似,但是没有auto或register关键字。 但
我是Spring的新手,我正在尝试自动连接一个通用DAO。不幸的是,我遇到了一个错误。我试图根据它搜索信息,但大多数解决方案都声明使用@Qualifier注释,我认为这与我想要实现的目标背道而驰。 所以下面的一些代码(我将摆脱类参数,一旦我处理当前问题): 道 服务 和下面抛出的错误:
可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定
问题内容: 以下代码在t3行中出现编译错误: 错误消息是: 类型不匹配:无法从对象转换为T 我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败? 编辑:添加了错误消息。 编辑:添加了另一个示例如何不会发生该错误。 编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。 问题答案: 在第一种情况下,您有两个具有名为的类型参数的泛型方法,但是这些类
问题内容: 我的程序: 我收到此错误:。语法绝对正确,我已经检查了一百万遍。怎么了? 问题答案: 您只能在类级别具有字段声明。这样的if语句必须位于方法,构造函数或初始化程序块中。 您可以消除这样的if语句: 但是我质疑为什么您根本不想在创建时设置此值,而不是响应某些用户操作。