为什么java中文转byte出现负数
问题:下面代码中输入字符串使用getBytes()方法为什么会产生负数?是不是编码问题?Java中我输入的“啊d”是不是GBK编码?存储的时候是不是以补码形式存储?代码:...
问题:下面代码中输入字符串使用getBytes()方法为什么会产生负数?是不是编码问题?
Java中我输入的“啊d”是不是GBK编码?存储的时候是不是以补码形式存储?
代码:
import java.io.*;
public class StatisticsChar {
public static void main(String[] agrs) throws IOException
{
String zifuchuan=new String("");
int hanzishu=0;int zimu=0;int kongge=0;int shuzi=0;int qita=0;
System.out.print("请输入一行字符:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
zifuchuan=stdin.readLine();
byte[] bytes=zifuchuan.getBytes();//此处使用getBytes()为什么出现负数
//假设我输入--> 啊d
System.out.println(bytes[0]); //--> -80
System.out.println(bytes[1]); //--> -95
System.out.println(bytes[2]); //-->100
for(int i=0;i<bytes.length;i++)
{
if((bytes[i]>=65&&bytes[i]<=90)||(bytes[i]>=97&&bytes[i]<=122))
zimu++;
else if(bytes[i]==32)
kongge++;
else if(bytes[i]>=48&&bytes[i]<=57)
shuzi++;
else if(bytes[i]<0)
hanzishu++;
else
qita++;
}
System.out.println("字符串所占字节个数为:"+bytes.length);
System.out.println("汉字个数为:"+hanzishu/2);
System.out.println("英文字母个数为:"+zimu);
System.out.println("空格个数为:"+kongge);
System.out.println("数字个数为:"+shuzi);
System.out.println("其他字符个数为:"+qita);
}
} 展开
Java中我输入的“啊d”是不是GBK编码?存储的时候是不是以补码形式存储?
代码:
import java.io.*;
public class StatisticsChar {
public static void main(String[] agrs) throws IOException
{
String zifuchuan=new String("");
int hanzishu=0;int zimu=0;int kongge=0;int shuzi=0;int qita=0;
System.out.print("请输入一行字符:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
zifuchuan=stdin.readLine();
byte[] bytes=zifuchuan.getBytes();//此处使用getBytes()为什么出现负数
//假设我输入--> 啊d
System.out.println(bytes[0]); //--> -80
System.out.println(bytes[1]); //--> -95
System.out.println(bytes[2]); //-->100
for(int i=0;i<bytes.length;i++)
{
if((bytes[i]>=65&&bytes[i]<=90)||(bytes[i]>=97&&bytes[i]<=122))
zimu++;
else if(bytes[i]==32)
kongge++;
else if(bytes[i]>=48&&bytes[i]<=57)
shuzi++;
else if(bytes[i]<0)
hanzishu++;
else
qita++;
}
System.out.println("字符串所占字节个数为:"+bytes.length);
System.out.println("汉字个数为:"+hanzishu/2);
System.out.println("英文字母个数为:"+zimu);
System.out.println("空格个数为:"+kongge);
System.out.println("数字个数为:"+shuzi);
System.out.println("其他字符个数为:"+qita);
}
} 展开
展开全部
GBK采用双字节8位表示,总体编码范围为 8140 -- FEFE,首字节在 81 -- FE 之间,尾字节在 40 -- FE 之间。
ASCII是7位编码,只使用前7位,第8位补0,所以转换成整数始终为正数,而GBK是8位编码,也就是说一个字节中的第8位可以为1,如1010 1101,而将其转换成byte类型时,byte值为10101101,以补码存储,第8位被当成符号位,当然是负数了,值为:-83。
“何”字的GBK编码是:BA CE(1011 1010 1100 1110),两个字节第8位都为1,对byte类型来说,都被理解为最高位符号位。这样值就变成-70和-50了。
ASCII是7位编码,只使用前7位,第8位补0,所以转换成整数始终为正数,而GBK是8位编码,也就是说一个字节中的第8位可以为1,如1010 1101,而将其转换成byte类型时,byte值为10101101,以补码存储,第8位被当成符号位,当然是负数了,值为:-83。
“何”字的GBK编码是:BA CE(1011 1010 1100 1110),两个字节第8位都为1,对byte类型来说,都被理解为最高位符号位。这样值就变成-70和-50了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询