C語言 有符號、無符號
有符號無符號說明
一、有符號 signed
-
char 8bit 取值范圍:-2^7 ~ 2^7-1 、 -128~127
-
int 32bit 取值范圍:-2^31 ~ 2^31-1 、 -2147483648~2147483647
-
long long 64bit 取值范圍:-2^63 ~ 2^63-1
#include <stdio.h> int main() { signed int a = -1089474374; //定義有符號整型變量a printf("%X\n", a); //結果為 BF0FF0BA //B F 0 F F 0 B A //1011 1111 0000 1111 1111 0000 1011 1010 return 0; }
注:數據存儲時將-0對應的區間值設置為最小值 -2^7
二、無符號 unsigned
1、說明
數據存儲在計算機中不存在符號位
無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。
#include <stdio.h> int main() { unsigned int a = 3236958022; //定義無符號整型變量a printf("%X\n", a); //結果為 C0F00F46 return 0; }
2、詳解
當我們寫程序要處理一個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。
-
char 8bit 取值范圍:0~2^8-1、0~255
-
int 32bit 取值范圍:0~2^32-1、0~4294967295
3、表范圍
數據類型 |
占用空間 |
取值范圍 |
short |
2字節 |
-32768 到 32767 (-215 ~ 215-1) |
int |
4字節 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
long |
4字節 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
unsigned short |
2字節 |
0 到 65535 (0 ~ 216-1) |
unsigned int |
4字節 |
0 到 4294967295 (0 ~ 232-1) |
unsigned long |
4字節 |
0 到 4294967295 (0 ~ 232-1) |
數據溺出說明
當超過一個數據類型能夠存放最大的范圍時,數值會溢出。
有符號位最高位溢出的區別:符號位溢出會導致數的正負發生改變,但最高位的溢出會導致最高位丟失。
#include <stdio.h> int main() { char ch; //符號位溢出會導致數的正負發生改變 ch = 0x7f + 2; //127+2 printf("%d\n", ch); // 0111 1111 //+2后 1000 0001,這是負數補碼,其原碼為 1111 1111,結果為-127 //最高位的溢出會導致最高位丟失 unsigned char ch2; ch2 = 0xff+1; //255+1 printf("%u\n", ch2); // 1111 1111 //+1后 10000 0000, char只有8位最高位的溢出,結果為0000 0000,十進制為0 ch2 = 0xff + 2; //255+1 printf("%u\n", ch2); // 1111 1111 //+1后 10000 0001, char只有8位最高位的溢出,結果為0000 0001,十進制為1 return 0; }