java中的负数

在写下面这个校验的时候,某个测试得到的结果是ffffffd9,
debug看到sum是负数。

/**
     * 所有字节的八位算术和对256取余
     * @param bytes
     * @return
     */
    public static String checkSum(byte[] bytes) {
        int sum = 0;
        for (byte b : bytes) {
            sum = (sum + b);
        }
        return String.format("%x", sum % 256);
    }

解决办法,加上& 0xff

public static String checkSum(byte[] bytes) {
        int sum = 0;
        for (byte b : bytes) {
            sum = (sum + b & 0xff);
        }
        return String.format("%x", sum % 256);
    }

因为 byte占有一个字节,总共8位,最高位是符号位,取值范围是-128-127,把byte转int结果就是低八位不变(也就是byte),其他位全部都是1,所以出现了0xffffffd9

引用

java中的负数进制转换

你可能感兴趣的:(java中的负数)