为什么Byte.parseByte(" 80",16)失败?

时间:2017-04-11 14:22:54

标签: java hex byte base numberformatexception

private func makeViewFinderMask() -> CAShapeLayer {

    let path = UIBezierPath(rect: bounds)
    let croppedPath = UIBezierPath(roundedRect: viewFinderBounds(), cornerRadius: viewFinderRadius)
    path.append(croppedPath)
    path.usesEvenOddFillRule = true

    let mask = CAShapeLayer()
    mask.path = path.cgPath
    mask.fillRule = kCAFillRuleEvenOdd
    return mask
}

为什么第一次成功而第二次失败?人们可能会期望它们产生相同的输出。

2 个答案:

答案 0 :(得分:1)

十六进制0x80十进制为128。字节只能保存-128到127之间的值。因此,当您尝试解析值128时,它会失败,因为该值不能表示为byte

如果要解析负值,则需要包含一个负号:

System.out.println(Byte.parseByte("-80", 16)); /* Prints -128 */

例如,在执行narrowing conversion,时,从intbyte,如本例所示,可能会丢失有关值的整体大小的信息。将int值转换为byte只会丢弃除最低8位之外的所有值,因此将int 128转换为byte会产生-128

答案 1 :(得分:0)

第一个运算符是二进制移位。 -128代表二进制代码中的0b100000001向左移动了七次。
在第二个语句中,您使用的基数是hex个数字,如Tutorialspoint的示例所示。如果您将语句更改为System.out.println(Byte.parseByte("80", 10));,则不会获得例外。
希望这些解释有所帮助。