我希望特定表格中的某个列不会得到负数。 有没有办法在derby DB中声明unsigned int?
答案 0 :(得分:1)
问:有没有办法在Derby DB表中声明一个“unsigned int”列?
答:我相信答案是“不”:
http://db.apache.org/derby/docs/10.0/manuals/reference/sqlj124.html
http://db.apache.org/derby/docs/10.0/manuals/reference/sqlj124.html
......但是......
您应该可以轻松地在任何查询中“存储”存储的值:
答案 1 :(得分:0)
答案是否定的。 Java(遗憾的是)不支持未签名的算术。
但你仍然可以使用Java int
并使用自己的方法来执行无符号算术,例如this。更好的是创建一个UnsignedInteger
类,让它处理所有算术。
我不知道它是否值得。你可以像jtahlborn建议的那样使用long
。
答案 2 :(得分:0)
Java 不支持类型 unsigned int
,而不是 C 或 C++。
另一方面,有一种简单的方法可以通过使用:
long
变量/文字(int)
首先,让我们注意到有符号整数和无符号整数具有相同的位数;它们的大小都是 32 位。
主要区别在于,对于有符号整数,MSB(最高有效位)或位 0 用于指示实际整数是负数还是正数。
如果该位设置为 1,则整数为负,如果设置为 0,则整数为负。因此,您最终将得到 31 位的整数值和 1 位的符号。
对于无符号整数,所有的 32 位都用来表示整数的值。您现在可以拥有更大的数字。
signed integers
范围从 -2^31
到 (2^31 - 1)
unsigned integers
范围从 0
到 (2^32 - 1)
要显示大小限制问题,请尝试编译以下代码段:
public static void main (String[] args){
int i = 2_147_483_648;//This line will generate a compiler error
}
}
编译器会抱怨说 integer number too large
。
让我们看看如何绕过这一点,并将这个数字仍然存储在一个 Java 整数中,然后将其取回。
所提议的解决方案背后的想法源于这样一个事实,即一系列位被解释为某种意义。它可以是图像、Java 对象、C 结构体、字符等的表示。
您根据您“期望”该系列位表示的内容来“解释”该系列位。如果您需要一个字符,您可能希望将系列与 ASCII 表进行匹配。如果您需要图像,您可能希望解码 JPEG。
现在,回到整数,如果您正在寻找 signed integers
,您会将 MSB 解释为符号位。如果您正在寻找 unsigned integers
,您会将 MSB 解释为值的一部分。
举个例子,让我们假设您有以下 32 位序列:
MSB 设置为 1,所有其他位均为 0。
如果您正在寻找/期望 signed integer
,这 32 位将被解释为负十进制数 -2_147_483_648
如果您正在寻找/期望 unsigned integer
,那么这些相同的 32 位将被解释为正十进制数 2_147_483_648
因此,解决方案是将值存储在一个有符号的 32 位整数中,并将它们解释为一个无符号的 32 位整数。
以下是我们将如何修改前面的代码段并将 2_147_483_648
保存为整数值并能够正确打印它。
为此,我们将:
long
中间数据类型/值int
以保存它&
额外的位并显示它 public static void main (String[] args){
//1. cast a 64-bit long value that fits into a 32-bit int
int i = (int)2_147_483_648L;
//2. Mask the extra long bits
System.out.println(i & 0x0000_0000_FFFF_FFFFL);
}
}
long
变量可以容纳 64 位,其 MSB 或符号位不受其前 32 位的影响。你会注意到这里发生了一个按位运算:
i & 0x0000_0000_FFFF_FFFFL
这告诉编译器忽略或屏蔽超出我们感兴趣的前 32 位的所有位。我们的整数是 32 位。
如果您想在保存之前对 int
值进行一些算术运算,您可以再次求助于 long
中间变量。
以下是方法,这将是建议的解决方案:
public static void main (String[] args){
int i = (int)2_147_483_648L;
int j = 1_000_000;
long tempL = i + j;//Use a temp long to perform the operations
i = (int)tempL; //We save back into i and store in a DB for example
//Now we use the saved value to display it, for example
System.out.println(i & 0x0000_0000_FFFF_FFFFL);
}
}
祝你好运,希望以上内容有所帮助!