C语言中无符号短整型与无符号字符型按位运算及类型转换问题
C语言中unsigned short与unsigned char的按位操作规则
在C语言的按位运算里,首先会触发整数提升机制:当不同宽度的无符号整数参与运算时,宽度更小的类型会被自动提升为宽度更大的同系列类型。
拿你给出的代码举例:
unsigned char mask1 = 0x55; //01010101 unsigned short int mask2 = 0x8055;//1000000001010101 unsigned short int res = 0; //0000000000000000 res = mask1 | mask2;
mask1是unsigned char(1字节),会被提升为unsigned short(2字节),提升时高位的空位会补0,也就是变成二进制0000000001010101(十六进制0x0055)。- 随后提升后的
mask1和mask2执行按位或|操作,按位或的逻辑是对应位只要有一个为1,结果位就为1,运算过程完全和你描述的一致:
0000000001010101 | 1000000001010101 ---------------- 1000000001010101
最终res的二进制值就是1000000001010101,对应十六进制0x8055。
核心要点
- 无符号窄类型参与运算时,会被提升为更宽的无符号类型,高位统一补0(无符号类型没有符号位,所以补0而非符号位)。
- 按位操作是在提升后的同宽度类型上执行的,运算结果的类型也与提升后的类型一致。
内容的提问来源于stack exchange,提问作者Pentakorr
相关产品推荐
相关产品推荐

