char类型按位运算失败转int
char type bitwise operation fails in to int
我正在尝试在 C 中按位运算。这是我的代码:
int main() {
char c = 127;
c <<= 1;
if (c == 0xfe) {
printf("yes");
}
else {
printf("No");
}
return 0;
}
系统控制台打印号
我期望收到的是 Yes。
位移动后c中的值是ffffffffe。
似乎系统已经将 8 位更改为 32 位。谁能帮帮我。
你已经正确计算出低字节的内容,即0xfe
。然而,这里实际发生的事情还有很多:当你写
if (c == 0xfe) {
...
}
您正在将 c
、char
与 int
常量 0xfe
进行比较。在这种情况下,C 规则需要 promoting char c
到 int
进行比较。由于 char
在您的平台上签名,0xfe
被提升为 0xfffffffe
,这就是比较随后失败的原因。
如果要在 char
类型中进行比较,请将 0xfe
转换为 char
,如下所示:
if (c == (char)0xfe) {
...
}
另一方面,无符号字符不会给您带来 int
提升的麻烦,因为它们非常适合 int
:
unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
...
}
注意: c <<= 1
的行为是 implementation-defined 由于 char
溢出。
我正在尝试在 C 中按位运算。这是我的代码:
int main() {
char c = 127;
c <<= 1;
if (c == 0xfe) {
printf("yes");
}
else {
printf("No");
}
return 0;
}
系统控制台打印号 我期望收到的是 Yes。 位移动后c中的值是ffffffffe。 似乎系统已经将 8 位更改为 32 位。谁能帮帮我。
你已经正确计算出低字节的内容,即0xfe
。然而,这里实际发生的事情还有很多:当你写
if (c == 0xfe) {
...
}
您正在将 c
、char
与 int
常量 0xfe
进行比较。在这种情况下,C 规则需要 promoting char c
到 int
进行比较。由于 char
在您的平台上签名,0xfe
被提升为 0xfffffffe
,这就是比较随后失败的原因。
如果要在 char
类型中进行比较,请将 0xfe
转换为 char
,如下所示:
if (c == (char)0xfe) {
...
}
另一方面,无符号字符不会给您带来 int
提升的麻烦,因为它们非常适合 int
:
unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
...
}
注意: c <<= 1
的行为是 implementation-defined 由于 char
溢出。