鍍金池/ 問(wèn)答/C  C++/ 為什么char類(lèi)型能表示數(shù)值128?

為什么char類(lèi)型能表示數(shù)值128?

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


打印出來(lái)128 然而char類(lèi)型一共8個(gè)位 只能存儲(chǔ)-128到127 為什么能打印出來(lái)呢?

回答
編輯回答
凝雅

因?yàn)?-c 作為 printf 的參數(shù)時(shí),默認(rèn)轉(zhuǎn)換成 int 類(lèi)型了。

請(qǐng)參考編譯器生成的匯編指令, 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 的第二個(gè)參數(shù),請(qǐng)向上追溯。
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret

作為對(duì)比,強(qiáng)制轉(zhuǎn)換成 char 類(lèi)型變成這樣

#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              // 強(qiáng)制轉(zhuǎn)換類(lèi)型后,多了這一行。
  mov esi, eax               // eax 是 printf 的第二個(gè)參數(shù),請(qǐng)向上追溯。
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret
2017年10月10日 18:28