C语言整型知识

本文介绍了C语言中的整型类型,包括有符号和无符号整型,如signed char、unsigned int等,并强调了类型间的取值范围和转换注意事项。还提到了不同编译器和平台下整型占用字节数的差异,以及如何使用sizeof和limits.h来查询类型信息。

初入C语言,有理解错误或不正确请多指教、纠正!

C语言整型int是英文integer的缩写,int分为有符号(signed)和无符号(unsigned)整型。

C语言整型有如下:

一、有符号

  • 1、signed char 可简化为 char
  • 2、signed short int 可简化为 short
  • 3、signed int 可简化为 int
  • 4、signed long int 可简化为 long
  • 5、signed long long int 可简化为 long long

二、无符号

  1. unsigned char
  2. unsigned short int 可简化为 unsigned short
  3. unsigned int
  4. unsigned long int 可简化为 unsigned long
  5. unsigned long long int 可简化为 unsigned long long

虽然完整写法比较麻烦,不过意义明确。

三、注意点

  1. 上面类型越往下的类型取值范围越大,不能把大的数值往小的类型装,会导致数据不正确
  2. 类型所占用的字节数不同的编译器、平台会有差别。如int在16位系统占用2个字节,在32、64位一般占用4个字节。另外long在windows只占用4个字节,在类Unix中long占用8个字节
  3. 一个字节(Byte)有8个二进制位(Bit),即 1Byte=8Bit
  4. 有符号整型二进制的最高位为符号位,0表示正数,1表示负数。因此有符号一个字节只有7个二进制位是数据位(取值范围计算方法:-2^7~2^7-1,为什么是7次方而不是8次方?因为二进制最高位是符号位。为什么正数要减1呢?因为正数范围多了一个0)
  5. 无符号整型所有二进制位全部是数据位(取值范围计算方法:0~2^8-1,为什么正数要减1呢?因为正数范围多了一个0)
  6. 类型具体占用多少字节可用sizeof关键进行查询
  7. 可引入limits.h头文件,打印输出各类型最小取值、最大取值范围(具体看代码段)

四、各类型取值范围(以windows10系统64位为例) 

  •         signed char      -> -2^7-1  至 2^7-1   即 -128 至 127
  •         signed short     -> -2^15-1 至 2^15-1  即 -32768 至 32767
  •         signed int       -> -2^31-1 至 2^31-1  即 2,147,483,648 至 2,147,483,647
  •         signed long      -> -2^31-1 至 2^31-1  即 2,147,483,648 至 2,147,483,647
  •         signed long long -> -2^63-1 至 2^63-1  即 9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
  •         unsigned char      -> 0  至 2^8-1   即 0 至 255
  •         unsigned short     -> 0  至 2^16-1  即 0 至 65535
  •         unsigned int       -> 0  至 2^32-1  即 0 至 4,294,967,295
  •         unsigned long      -> 0  至 2^32-1  即 0 至 4,294,967,295
  •         unsigned long long -> 0  至 2^64-1  即 0 至 18,446,744,073,709,551,615 

#include <stdio.h>
#include <limits.h> //各类型的最大取值范围和最小取值范围定义头文件
/*
    1、整型可分为char、short、int、long、long long,越往后取值范围越大
    2、还可以上面的关键字前面加另外两个修饰符指定是有符号还是无符号整型:unsigned(无符号)、signed(有符号、默认不加就是有符号),规范写法建议写上
    3、每个编译器和平台,整型所占用的字节可能不一样。早期16位系统int只占2个字节。现在32位编译器int占用4个字节
    4、一个字节(Byte)等于8位(bit)二进制
    5、用sizeof关键字可测量类型、变量、常量等所占用的字节
    6、有符号signed在二进制的最高位作为符号位,0表示正数,1表示负数
    7、各类型取值范围计算方法为:有符号-2^(n-1)到2^(n-1)-1,无符号0到2^n-1。其中n代表占用字节数乘以8。
        a、为什么有符号n要减1呢?因为二进制最高位是符号位
        b、为什么正数要减1呢?因为正数范围多了一个0
*/
int main(){
    
    printf("---------signed integer-----------\n");
    printf("signed char size = %d Byte\n", sizeof(signed char)); //char 等同于signed char写法,后面这种更加明确规范。下面同理
    //printf("signed short size = %d Byte\n", sizeof(signed short)); // %d其中d是英文decimal的缩写,中文是十进制的意思
    printf("signed short int size = %d Byte\n", sizeof(signed short int));
    printf("signed int size = %d Byte\n", sizeof(signed int));
    //printf("signed long size = %d Byte\n", sizeof(signed long));
    printf("signed long int size = %d Byte\n", sizeof(signed long int));
    //printf("signed long long size = %d Byte\n", sizeof(signed long long)); 
    printf("signed long long int size = %d Byte\n", sizeof(signed long long int)); 
    //有符号各类型取值范围
    /*
        signed char      -> -2^7-1  至 2^7-1   即 -128 至 127
        signed short     -> -2^15-1 至 2^15-1  即 -32768 至 32767
        signed int       -> -2^31-1 至 2^31-1  即 2,147,483,648 至 2,147,483,647
        signed long      -> -2^31-1 至 2^31-1  即 2,147,483,648 至 2,147,483,647
        signed long long -> -2^63-1 至 2^63-1  即 9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
    */
   //验证输出各类型最小取值范围和最大取值范围
   printf("------\n");
   printf("signed char min: %d max: %d\n", CHAR_MIN, CHAR_MAX);
   printf("signed short int min: %d max: %hd\n", SHRT_MIN, SHRT_MAX);
   //printf("signed short min: %d max: %hd\n", SHRT_MIN, SHRT_MAX);
   printf("signed int min: %d max: %d\n", INT_MIN, INT_MAX);
   printf("signed long int min: %ld max: %ld\n", LONG_MIN, LONG_MAX);
   //printf("signed long min: %ld max: %ld\n", LONG_MIN, LONG_MAX);
   printf("signed long long int min: %lld max: %lld\n", LONG_LONG_MIN, LONG_LONG_MAX);
   //printf("signed long long min: %lld max: %lld\n", LONG_LONG_MIN, LONG_LONG_MAX);

    printf("---------unsigned integer-----------\n");
    printf("unsigned char size = %d Byte\n", sizeof(unsigned char));
    //printf("unsigned short size = %d Byte\n", sizeof(unsigned short));
    printf("unsigned short int size = %d Byte\n", sizeof(unsigned short int));
    printf("unsigned int size = %d Byte\n", sizeof(unsigned int));
    //printf("unsigned long size = %d Byte\n", sizeof(unsigned long));
    printf("unsigned long int size = %d Byte\n", sizeof(unsigned long int));
    //printf("unsigned long long size = %d Byte\n", sizeof(unsigned long long));
    printf("unsigned long long int size = %d Byte\n", sizeof(unsigned long long int));
    //无符号各类型取值范围
    /*
        unsigned char      -> 0  至 2^8-1   即 0 至 255
        unsigned short     -> 0  至 2^16-1  即 0 至 65535
        unsigned int       -> 0  至 2^32-1  即 0 至 4,294,967,295
        unsigned long      -> 0  至 2^32-1  即 0 至 4,294,967,295
        unsigned long long -> 0  至 2^64-1  即 0 至 18,446,744,073,709,551,615
    */
   //验证输出无符号各类型最小取值和最大取值范围
   printf("------\n");
   printf("unsigned char min: %d max: %u\n", 0, UCHAR_MAX);
   printf("unsigned short int min: %d max: %u\n", 0, USHRT_MAX);
   //printf("unsigned short min: %d max: %u\n", 0, USHRT_MAX);
   printf("unsigned int min: %d max: %lu\n", 0, UINT_MAX);
   printf("unsigned long int min: %d max: %lu\n", 0, ULLONG_MAX);
   //printf("unsigned long min: %d max: %lu\n", 0, ULLONG_MAX);
   printf("unsigned long long int min: %d max: %llu\n", 0 ,ULONG_LONG_MAX);
   //printf("unsigned long long min: %d max: %llu\n", 0 ,ULONG_LONG_MAX);
   
    return 0; //返回给操作系统内核,返回0说明程序正常退出
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值