在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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


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

回答
編輯回答
凝雅

因?yàn)?-c 作為 printf 的參數(shù)時(shí),默認(rèn)轉(zhuǎn)換成 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 的第二個(gè)參數(shù),請向上追溯。
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret

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