天天看點

C語言 有符号、無符号

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、說明

資料存儲在計算機中不存在符号位

無符号數最高位不是符号位,而就是數的一部分,無符号數不可能是負數。

C語言 有符号、無符号
#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;
}