c - 如果 char c = 0x80,为什么 printf ("%d\n", c << 1) 输出 -256?

标签 c integer-promotion

#include<stdio.h>
int main(void)
{
  char c = 0x80;
  printf("%d\n", c << 1);
  return 0;
}

输出是-256在这种情况下。如果我写 c << 0那么输出是-128 .

我不明白这段代码背后的逻辑。

最佳答案

char可能会在您的平台上签名,在这种情况下 0x80表示 -128(假设为二进制补码)。

char用作 << 的操作数运营商,它被提升为int (仍然是-128)。所以当你应用左移时,你会得到 -256。从技术上讲,移动负值是实现定义未定义的,但您看到的是典型行为。

关于c - 如果 char c = 0x80,为什么 printf ("%d\n", c << 1) 输出 -256?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4001630/

相关文章:

c - 位移位和整数提升?

c - RegLoadKey 到卷影副本中的配置单元文件

c - 尝试编译一个C程序

c - C 中涉及套接字和客户端-服务器通信的程序问题

c - 解释双星号从数组返回值(在 C 中)

c - 机器上int数据类型的宽度

c - scanf 卡住了

c++ - 什么时候类型会提升为无符号整型?

char类型按位运算失败转int

c - char 和 short 在赋值表达式中被降级之前会被提升为 int 吗?