package com.jt.test.redis; import org.junit.Test; /* 题目要求 * 编码:GBK,一个英文字符占一个字节,一个汉字占2个字节 * 随机给定一个字符串,例如:js3范ad啊asd * 随机给定一个数字为截取字符串的长度,例如:6 * 根据给定的数字截取字符串,结果:js3范a * 如果给定截取长度最后一个字符是英文,就直接截取,如上面的例子 * 如果给定截取长度最后一个是汉字, * 若正好截取整个汉字,就直接输出,例如:“js3范ad啊asd”,截取5,则输出:“js3范” * 若是汉字的一半,就舍弃这个汉字输出,例如:“js3范ad啊asd”,截取4,则输出:“js3” */ public class test { /* 我知道问题的答案,有一个点不明白, * 现在的问题是不明白为什么 c==arr[3] 输出结果是false * 一开始认为是 == 造成的地址问题 * 现在认为是byte转int造成的转码问题 */ @Test public void test() throws Exception { String str="js3范ad啊asd"; byte[] arr = str.getBytes("GBK"); // 变量里面存的都是补码 // byte: arr[3] 1011 1010 // 转成int: 1111 1111 1111 1111 1111 1111 1011 1010 // 强转char:1111 1111 1011 1010 char c=(char) arr[3]; System.out.println(c); System.out.println((int)c); // 65463 源码:1111 1111 1011 1010 System.out.println(arr[3]); // -73 源码:1100 0101 // false, 比较的时候都转成int类型 // c :char转为int: 0000 0000 0000 0000 1111 1111 1011 1010 // arr[3]: byte转为int: 1111 1111 1111 1111 1111 1111 1011 1010 // 所以是false System.out.println(c==arr[3]); // 所以是false System.out.println(); // 下面都明白 char d=(char) arr[1]; System.out.println((int)d); System.out.println(d); System.out.println(arr[1]); System.out.println(d==arr[1]); // true } }