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

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;
}