C++Unicode转十六进制代码中*pc & 0x80的含义是什么?
关于
*pc & 0x80运算的含义与作用解释 1. 运算的字面含义
0x80是十六进制常量,对应8位二进制值为10000000,即8位字节的最高位为1,其余位为0&是C++按位与运算符,只有两个操作数对应比特位均为1时,结果对应比特位才为1- 因此
*pc & 0x80的作用是检测当前字符指针指向的8位字节的最高位是否为1:运算结果非0则最高位为1,为0则最高位为0
2. 该判断在代码中的业务作用
这段代码是针对UTF-8编码的字符串设计的,UTF-8编码规则天然适配这个判断逻辑:
UTF-8是变长编码:
- 单字节ASCII字符的编码最高位固定为0,格式为
0xxxxxxx,对应十进制范围0~127- 多字节Unicode字符的每一个编码字节最高位固定为1,比如2字节字符首字节格式为
110xxxxx,后续字节格式为10xxxxxx,所有字节最高位均为1
这个判断就是用来区分当前字节是ASCII单字节字符,还是多字节Unicode字符的组成字节。
3. 配套分支逻辑的设计原因
大部分编译器默认char是有符号8位整数,取值范围为-128~127:
- 如果字节最高位为1,有符号
char会被解析为负数,直接输出十六进制会得到带高位补f的错误结果(比如0xffffffc4),不符合单字节编码输出的需求 - 因此判断到最高位为1时,执行
*pc & 0xff运算,相当于将有符号char隐式转换为无符号8位整数,输出就会得到正确的单字节十六进制值 - 如果最高位为0,说明是ASCII字符,不存在符号问题,直接输出即可
4. 示例运行说明
你示例中调用传入的"đ"是Unicode字符,UTF-8编码为2字节0xC4 0x91,两个字节最高位均为1,因此输出结果为0xc4 0x91,符合Unicode字符拆解为十六进制编码的需求。
内容的提问来源于stack exchange,提问作者Mahith Samaraweera
相关产品推荐
相关产品推荐

