当我们说java中字节的宽度是8位时,这意味着什么?

当我们说java中字节的宽度是8位时,这意味着什么?,java,primitive-types,Java,Primitive Types,我可以存储从-127到127的数字,但除此之外,这是不可能的,编译器会给出警告。127的二进制值是01111111,130是1000010,仍然是相同的大小(8位),我认为我可以将130存储在字节中,但这是不可能的。这是怎么发生的?Java没有无符号类型,Java中的每个数字类型都有符号(除了char,但它不是用来表示数字,而是用来表示unicode字符) 让我们看看字节。它是一个字节,即8位。如果它是无符号的,则是,其范围为0..255 但是如果它是有符号的,则需要1位信息来存储符号(2个可能

我可以存储从-127到127的数字,但除此之外,这是不可能的,编译器会给出警告。127的二进制值是01111111,130是1000010,仍然是相同的大小(8位),我认为我可以将130存储在字节中,但这是不可能的。这是怎么发生的?

Java没有无符号类型,Java中的每个数字类型都有符号(除了
char
,但它不是用来表示数字,而是用来表示unicode字符)

让我们看看
字节
。它是一个字节,即8位。如果它是无符号的,则是,其范围为0..255

但是如果它是有符号的,则需要1位信息来存储符号(2个可能的值:+或-),这就剩下7位来存储数字(绝对)值。7位信息的范围为0..127

请注意,有符号整数的表示在大多数语言(包括Java)中都使用数字格式


注意:Java的
字节类型的范围实际上是-128..127。范围-127..127仅包含255个数字(而不是256,这是8位的所有组合的数字)。

第一位表示数字的符号:当第一位为1时,数字为负数。当第一位为0时,则数字为正。因此,基本上只有7位可用于存储数字的大小。(使用一个小技巧,对于负数,这个大小被移动1-否则,“零”将有两种不同的位模式,即00000000和10000000)

当您想要存储一个像130这样的数字,其二进制表示为1000010时,由于第一位为1,它将被解释为负数


另请参见,其中更详细地解释了幅度如何移动的技巧。

在Java中,
字节是有符号的数据类型。您考虑的是无符号字节,在这种情况下,可以将值130存储为8位。但对于也允许负数的有符号数据类型,第一位是指示负数所必需的


有两种方法可以存储负数,(和),但最流行的是二的补码。它的好处是,对于二的补码,大多数算术运算不需要考虑数字的符号;它们可以在不考虑符号的情况下工作。

Java使用有符号整数(以及字节、长和短)的表示形式可能与的重复。虽然两个补码中表示的数字确实具有最高有效位集,当且仅当它们为负数时,使用“符号”和“大小”的解释是错误的。一个字节能代表的最大负数–128具有位模式
10000000
,但很明显,它的大小不是零。@5gon12eder我试着澄清一下。很难用一种易懂且绝对准确的方式来写这篇文章(至少,在不深入研究两个补语并复制整个维基百科文章的情况下…@MarkoTopolnik你是对的,请注意,我实际上使用了
char
作为
unsigned short
,并在项目中取得了成功。最好将
char
视为具有表示Unicode字符的附加属性。@MarkoTopolnik是的,您可以将
char
用于数字,但这可能会导致混淆和源代码可读性降低。如果我看到一个字符类型为
char
的变量,我会立即联想到它:unicode字符。好吧,如果你真的需要这个范围,并且你有很紧的空间问题,那么使用
short
并强制所有的算术运算,就像它是无符号的一样,肯定会导致更糟糕的代码。一般来说,混淆是一个公平的观点,但当这是项目中经常使用的东西时,很快就会习惯。