- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去的两天里,我一直在阅读有关编码 Unicode Java 9 紧凑字符串的内容,我感觉好多了。但有一点我不明白。
关于字节数据类型
1).是8位存储范围是-128到127
问题
1).为什么Java没有像char unsigned 16位那样实现它?我的意思是它的范围是 0.256,因为从 0 到 127 我只能保存一个 Ascii 值,但是如果我将值设置为 200,扩展的 ascii 会溢出到 -56,会发生什么。
2).负值是否意味着什么?我的意思是我尝试了一个使用 Java 11 的简单示例
final char value = (char)200;//in byte would overflow
final String stringValue = new String(new char[]{value});
System.out.println(stringValue);//THE SAME VALUE OF JAVA 8
我已经检查了 String.value 变量,我看到了一个字节数组
System.out.println(value[0]);//-56
与之前出现的相同问题,-56 是否意味着其他语言中的(负值),检测到此溢出返回到值 200? Java怎么知道-56值与char中的200相同。
我尝试过最难的例子,比如代码点 128048,我在 String.value 变量中看到了这样的字节数组。
0 = 61
1 = -40
2 = 48
3 = -36
我知道这个代码点需要 4 个字节,但我知道如何将 char[] 转换为 byte[] 但我不知道 String 如何处理这个 byte[] 数据。
抱歉,如果这个问题很简单,抱歉,任何键入英语都不是我的自然语言,非常感谢。
最佳答案
Why Java didn't implement it like char unsigned 16 bits? i mean it would be in a range of 0.256 because from 0 to 127 only can i hold a Ascii value but what would happen if i set the value 200 a extended ascii would overflow to -56.
四分之一个世纪前,Java 的原始数据类型已在 Java 1.0 中解决。不到两年前,Java 9 中引入了紧凑字符串。这个新功能仅仅是一个实现细节,并不能证明对 Java 类型系统进行根本性改变是合理的。
除此之外,您正在查看存储在字节中的数据的一种解释。为了表示 iso-latin-1 单位,将相同的数据解释为 Java 内置的有符号 byte
会得到正数还是负数是完全无关的。
同样,Java 的 I/O API 允许将文件读入 byte[]
数组并将 byte[]
数组写回文件,这两个操作已经足以无损地复制文件,无论其文件格式如何,这在解释其内容时都是相关的。
因此,自 Java 1.1 起,以下内容有效:
byte[] bytes = "È".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
-56
200
这两个数字,-56
和 200
只是位模式 11001000
的不同解释,而 iso-latin-1 解释为包含位模式 11001000
的字节
是字符È
。
char
值也只是对两个字节数量的解释,即 UTF-16 代码单元。同样,char[]
数组是计算机内存中具有标准解释的字节序列。
我们还可以用这种方式解释其他字节序列。
StringBuilder sb = new StringBuilder().appendCodePoint(128048);
byte[] array = new byte[4];
StandardCharsets.UTF_16LE.newEncoder()
.encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
System.out.println(Arrays.toString(array));
将打印您看到的值,[61, -40, 48, -36]
。
在 String
类中使用 byte[]
数组的优点是,现在可以选择解释,在所有情况下使用 iso-latin-1字符可以用此编码表示,否则可以用 utf-16 表示。
可能的数字解释与字符串无关。但是,当您问“Java 如何知道 -56 值与 200 相同”时,您应该问自己,它如何知道 byte
的位模式 11001000
code> 首先是 -56
吗?
System.out.println(value[0]);
与普通计算机算术相比,
承担着实际上昂贵的操作,即将字节
(或int
)转换为字符串
。这种转换操作经常被忽视,因为它已被定义为打印字节的默认方式,但并不比转换为将值解释为字符串的字符串更自然。无签名数量。如需进一步阅读,我推荐Two's complement .
关于Java 11 紧凑字符串 char[] 到 byte[] 背后的魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55002968/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!