byte[] stuffA = {69,96,13,37,-69,-96,-13,-37};
for(int x = 0; x < stuffA.length; x++){
if(stuffA[x] < 0){
System.out.println("Somethin be up yo! ");
System.out.println("This number be negative! " + (int)stuffA[x]);
stuffA[x] = (byte)((int)stuffA[x] + 256);
System.out.println("I added 256 and now stuff is positive yo! " + stuffA[x]);
}
}
return;
当我运行它时,我的输出是:
Somethin be up yo!
This number be negative! -69
I added 256 and now stuff is positive yo! -69
Somethin be up yo!
This number be negative! -96
I added 256 and now stuff is positive yo! -96
Somethin be up yo!
This number be negative! -13
I added 256 and now stuff is positive yo! -13
Somethin be up yo!
This number be negative! -37
I added 256 and now stuff is positive yo! -37
发生了什么事?
答案 0 :(得分:1)
引用Java语言规范,第4.2.1部分:
整数类型的值是以下范围内的整数:对于
byte
,从-128到127(含)。
因此,-69 + 256 = 187 = 0x000000BB
施放到字节为0xBB = -69
。
答案 1 :(得分:1)
一个字节的范围在-128到127之间(-2 ^ 7到2 ^ 7-1)。添加256就像做360度转弯一样。在您的代码中更改256到128,将显示不同的结果
答案 2 :(得分:0)
byte
只有8位,所以只能容纳2 ^ 8 = 256个值。它在java中签名,因此值在[-128,127]范围内。
答案 3 :(得分:0)
byte
可以容纳256个不同的值。如果添加256字节溢出,结果保持不变。
在java中,范围是[-128,127]。
答案 4 :(得分:0)
一个字节可以保存256
个不同的值,因此当您添加256时,您将生成一个Rol (Rotate left) 8 times
,它返回与之前相同的值。
如果您希望改变-69
中的69
,那么为什么您只是不做stuffA[x] *=-1
?
如果您确实要反转这些位,可以使用complement operator
(~
),stuffA[x] = (byte) ~stuffA[x];
,但由于two's complement form
,要获得相同的数字您需要add 1
,
喜欢stuffA[x] = (byte) ((~stuffA[x]) + 1);
答案 5 :(得分:0)
字节为8位,整数为32位
基本上看位:
byte b = -37相当于219(int),其二进制为:
0000 0000 0000 1101 1011
int 256:
0000 0000 0001 0000 0000
添加两者将得到int值为475:
0000 0000 0001 1101 1011
现在将其转换为字节,即LSB 8位将为:
1101 1011
是-37
希望这能解释