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 | ||
unsigned short | 0 到 65535 (0 ~ 216-1) | |
unsigned int | 0 到 4294967295 (0 ~ 232-1) | |
unsigned long |
資料溺出說明
#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;
}