我读了 为什么Java中的字节范围是-128到127? 它说
128是10000000.倒置,它是01111111,再加一个得到10000000
所以它总结-128是10000000
所以+128不能用8位的2的补码表示,但这意味着我们可以用9位表示它,所以128是010000000,所以取其2的补码-128是110000000,
所以代表-128 10000000或110000000?表示位是否依赖?
为什么不简单地将较低范围-127个8位而不是将-128写为10000000?
由于SE 7 Java允许将值指定为二进制文字.文档告诉我'byte'是一种可以保存8位信息的类型,值为-128到127.
现在我不知道为什么,但我不能定义8位但只有7如果我尝试将二进制文字分配给Java中的一个字节,如下所示:
byte b = 0b000_0000; //solves to the value 0
byte b1 = 0b000_0001; //solves to the value 1
byte b3 = 0b000_0010; //solves to the value 2
byte b4 = 0b000_0011; //solves to the value 3
Run Code Online (Sandbox Code Playgroud)
依此类推,直到我们使用这7位获得最后几种可能性:
byte b5 = 0b011_1111; //solves to the value 63
byte b6 = 0b111_1111; //solves to the value 127
Run Code Online (Sandbox Code Playgroud)
如果我想让它成为负数我必须添加一个领先 - 在这样的前面:
byte b7 = -0b111_1111; //solves to the value -127
Run Code Online (Sandbox Code Playgroud)
现在问题的一半是我只使用7位来描述他们告诉我的是8位数据类型.下半部分是他们似乎没有线程作为二进制补码,除非使用32位int类型,我可以定义所有32位(包括"符号指示位").
现在,当我搜索如何显示范围内的数字-128时,我被告知这样做,没有任何进一步的解释:
byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;
Run Code Online (Sandbox Code Playgroud)
我可以清楚地看到最后8位(1000 0000)在使用8位的两个强制中确实代表-128,但我从来没有被混淆过多并尝试提出我的问题:
您好我正在学习java编程,我刚在我的书中有任务说将int varible转换为byte变量
byte b;
int i=257;
Run Code Online (Sandbox Code Playgroud)
当我将int转换为b
b=(byte) i;
Run Code Online (Sandbox Code Playgroud)
输出是1?当字节变量的值从-128变为127时它怎么可能在我的书中他们说字节变量的有效范围是256?
这是代码:
import java.io.*;
public class Bed {
private String bedfn;
private int bytes_snp;
private int nindiv;
private long bedsize;
private int nsnp;
private byte[] magicBytes;
public Bed(String bedfn, int bytes_snp, int nindiv) {
this.bedfn = bedfn;
this.bytes_snp = bytes_snp;
this.nindiv = nindiv;
bedsize = (new File(bedfn)).length();
nsnp = (int) ((bedsize - 3) / bytes_snp);
///////////////////////////////////////
magicBytes = new byte[] {0x6c, 0x1b, 0x01};
}
//...
public OutputStream writeBytes(OutputStream fileStream, byte[] bytes) {
try{
fileStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} …
Run Code Online (Sandbox Code Playgroud) 我可以存储-127到127之间的数字,但除此之外是不可能的,编译器会发出警告.二进制值127是01111111,130是10000010仍然是相同的大小(8位),我认为我可以存储130字节,但它是不可能的.那是怎么发生的?
我正在“Code Ranch”上阅读此页面,其中讨论了变量。
它正在讨论“有符号原语”,并说 0 算作负数???
我一直认为这些情况下 0 是阳性?
所有这些整数类型都是有符号的。最左边的位表示符号(正或负),不是值的一部分。例如,对于一个字节,您无法获得整个 8 位来表示您的值。您得到 7。这为您提供了字节范围:(-2 到第 7 个)到(2 到第 7 个)-1。为什么最后有那个小-1?因为那里有零,而零算作负数。与其他人的工作方式相同。
但是当看这篇文章时Why the range of bytes of bytes in Java? -128 to 127 in Java?
一条评论提到“默认情况下 0 为正”。它还谈到了“二人的赞美”,并提到最左边的位中带有“1”的任何内容都将是“负数”,而 0 则没有......
另外,如果 0 是负数 -128 到 0 就是 129 个负数,127 个正数,这没有意义......
所以我很好奇这是否是一个错误,或者 0 是否为负数,为什么?
另外,我正在阅读这篇文章原始浮点值如何为-0.0?这意味着什么?
那是在谈论值为 -0.0 的浮点数,并为其添加“0.0”以使其成为“中性/正数”0.0....
所以我很好奇浮点数中是否同时存在正零和负零,或者它是否同时存在于浮点和整数基元中???
另外,当我在谷歌上搜索这个问题的答案时,提到“零既不是正负也不是正负......”好奇这是否/何时适用于我们的语言?
谢谢
假设我有一个字节数组,我尝试使用以下代码将其编码为UTF_8
String tekst = new String(result2, StandardCharsets.UTF_8);
System.out.println(tekst);
//where result2 is the byte array
Run Code Online (Sandbox Code Playgroud)
然后,我使用getBytes()获取字节,值为0到128
byte[] orig = tekst.getBytes();
Run Code Online (Sandbox Code Playgroud)
然后,我希望使用ff对我的byte [] orig进行频率计数:
int frequencies = new int[256];
for (byte b: orig){
frequencies[b]++;
}
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我遇到一个错误
java.lang.ArrayIndexOutOfBoundsException: -61
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的字节仍包含负值,尽管将其转换为UTF-8?我有什么不对劲吗?有人可以告诉我这个原因的清晰度我仍然是这个主题的初学者.谢谢.