若是汉字的一半,就舍弃这个汉字输出,例如:“js3范ad啊asd”,截取4,则输出:“js3”

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
        
    }
}
原文地址:https://www.cnblogs.com/chuijingjing/p/9960868.html