C 中 char、signed char 和 unsigned char 的區別
來源:http://bbs.chinaunix.net/thread-889260-1-1.html
參考:https://publications.gbdirect.co.uk//c_book/chapter2/integral_types.html
ANSI C 提供了3種字符類型,分別是char、signed char、unsigned char
char相當於signed char或者unsigned char,但是這取決於編譯器!
這三種字符類型都是按照1個字節存儲的,可以保存256個不同的值。
signed char取值范圍是 -128 到 127
unsigned char 取值范圍是 0 到 255
但是char究竟相當於signed char呢還是相當於unsigned char呢??
這就是char和int的不同之處!
int == signed int,但是char不能簡單以為 == signed char
要確定char究竟等同什么要基於不同的編譯器做測試
大多數機器使用補碼來存儲整數,在這些機器中按照整數類型存儲的-1的所有位均是1
假設我的機器也是如此存儲,就能據此判斷char究竟是等於signed char還是unsigned char
編譯器提供以下參數來對char類型進行設置,
-funsigned-char : 設置為 unsigned char
-fno-signed-char : 設置為 非 signed char
-fsigned-char : 設置為 signed char
-fno-unsigned-char : 設置為 非 unsigned char
limits.h
/* Number of bits in a `char'. */ # define CHAR_BIT 8 /* Minimum and maximum values a `signed char' can hold. */ # define SCHAR_MIN (-128) # define SCHAR_MAX 127 /* Maximum value an `unsigned char' can hold. (Minimum is 0.) */ # define UCHAR_MAX 255 /* Minimum and maximum values a `char' can hold. */ # ifdef __CHAR_UNSIGNED__ # define CHAR_MIN 0 # define CHAR_MAX UCHAR_MAX # else # define CHAR_MIN SCHAR_MIN # define CHAR_MAX SCHAR_MAX # endif
/* The character type that char matches (i.e., signed or unsigned) */ #if CHAR_MIN < 0 typedef signed char underlying_char_type; #else typedef unsigned char underlying_char_type; #endif
test_char.c
#include <stdio.h> int main(void) { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d, b=%d, c=%d\n", a, b, c); return 0; }
output
# ./test_char.elf a=-1, b=-1, c=255 // 從這里可以看出 默認的 char 類型就是 signed char 類型
============ End