为什么char类型能表示数值128?

#include<stdio.h>
int main()
{
    char c=-128;
    printf("%d",-c);
}


打印出来128 然而char类型一共8个位 只能存储-128到127 为什么能打印出来呢?

阅读 2.7k
1 个回答

因为 -c 作为 printf 的参数时,默认转换成 int 类型了。

请参考编译器生成的汇编指令, x86_64 gcc 7.3, https://godbolt.org/

.LC0:
  .string "%d"
main:
  push rbp
  mov rbp, rsp
  sub rsp, 16
  mov BYTE PTR [rbp-1], -128
  movsx eax, BYTE PTR [rbp-1]
  neg eax
  mov esi, eax              // eax 是 printf 的第二个参数,请向上追溯。
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret

作为对比,强制转换成 char 类型变成这样

#include<stdio.h>
int main()
{
    char c=-128;
    printf("%d", (char)(-c));
}

编译后

.LC0:
  .string "%d"
main:
  push rbp
  mov rbp, rsp
  sub rsp, 16
  mov BYTE PTR [rbp-1], -128
  movzx eax, BYTE PTR [rbp-1]
  neg eax
  movsx eax, al              // 强制转换类型后,多了这一行。
  mov esi, eax               // eax 是 printf 的第二个参数,请向上追溯。
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题