前言

重温C语言相关基本知识,记录一下基本数据类型相关内容,方便自己查询和回顾。

  1. 只是简单记录,不涉及深入知识

  2. 代码来自参考文1

正文

C语言支持两种不同的数值类型:整数类型(也称整型)和浮点类型(也称浮点型)。

整数类型

C语言中整数类型包括intshortlonglong long布尔字符等,除了字符与布尔类型以外,其他所有整数类型都支持带符号与无符号的表示方式。

int类型

用关键字int声明的一个整数对象具有int类型。

整数字面量可以分别使用八进制、十进制以及十六进制的方式进行表达。

int一般占32个字节。其最大值和最小值要分有符号和无符号来说。

  1. 有符号

    signed int数据的最小值:-2^31 (即0x80000000)

    signed int数据的最大值:2^31-1 (即0x7FFFFFFF)

    signed int a = 10;
    //signed可以省略
    int a = 10;
  2. 无符合

    unsigned int数据的最小值:0

    unsigned int数据的最大值:2^32-1 (即0xFFFFFFFF)

    unsigned int a= 10 ;
    //int可以省略
    unsigned a= 10 ;

打印最大值和最小值:

#include <stdio.h>
#include <limits.h>

int main(int argc, const char * argv[]){
    //int 最小值
    printf("INT_MIN = %d\n", INT_MIN);  
    //int 最大值
    printf("INT_MAX = %d\n", INT_MAX);
    //unsigned int的最大值
    printf("UINT_MAX = %u\n", UINT_MAX);
}
short类型

短整型,标准表达为signed short int类型,其中signed与int均可省略。

short a ;

short一般占16个字节。其最大值和最小值也要分有符号和无符号来说。

  1. 有符号

    默认是有符号的。

    short数据的最小值:-2^15(即0x8000)

    short数据的最大值:2^15-1(即0x7FFF)

  2. 无符号

    short数据的最小值:0

    short数据的最大值:2^16-1(即0xFFFF)

short类型与unsigned short类型没有特别对应的整数字面量,它们可直接用int与unsigned int相应的整数字面量进行赋值。

打印最大值和最小值

#include <stdio.h>
#include <limits.h>

int main(int argc, const char * argv[]){
    //short 最小值
    printf("SHRT_MIN = %d\n", SHRT_MIN); 
    //short 最大值
    printf("SHRT_MAX = %d\n", SHRT_MAX); 
    //unsigned short最大值
    printf("USHRT_MAX = %u\n", USHRT_MAX);
}
long类型

长整型,标准表达为signed long int类型,其中signed与int均可省略。

也分有符号和无符号。

//有符号
long a = 100;
//有符号,加上后缀L,表示一个long类型的字面值
signed long int b = 100L;

//无符号
unsigned long a = 100;
unsigned long b = 100L;

打印最大值和最小值

#include <stdio.h>
#include <limits.h>

int main(int argc, const char * argv[]){
    // long 最小值
    printf("LONG_MIN = %ld\n", LONG_MIN); 
    // long 最大值
    printf("LONG_MIN = %ld\n", LONG_MAX); 
    //unsigned long最大值
    printf("ULONG_MAX = %lu\n", ULONG_MAX);
}
long long类型
  1. 有符号

标准表达为signed long long int,其中signed与int可省

long long a = 100;
//加上LL表示long long类型的字面值
long long b = 100LL;

long long的宽度均为8个字节(即64位)。其最小值为-2^63,最大值为2^63-1。

  1. 无符号

无符号标准表达为unsigned long long int, int可省,因此写为:

unsigned long long a = 100;
unsigned long long b = 100LL;

打印最大值和最小值

#include <stdio.h>
#include <limits.h>

int main(int argc, const char *argv[]){
   //long long类型的最小值
   printf("LLONG_MIN = %lld\n", LLONG_MIN);
   //long long类型的最大值
   printf("LLONG_MAX = %lld\n", LLONG_MAX);
   //unsigned long long类型的最大值
   printf("ULLONG_MAX = %llu\n", ULLONG_MAX);
}
布尔类型

布尔类型用于表达真假逻辑关系,一般用true表示真,false表示假。

C语言从C99标准开始就引入了<stdbool.h>头文件,里面用bool这个宏来定义_Bool,用true定义为1, false定义为0。

#include <stdio.h>
#include <stdbool.h>

int main(int argc, const char * argv[]){
    bool a = true;
    bool b = false;
    
    //声明了一个布尔对象c,并用a与b是否相等的比较结果对它初始化
    bool c = a == b;                       //这里c为假
    printf("c = %d\n", c);                //输出c = 0
    
    //用a ! = b(a不等于b)的比较结果给对象c
    c = a ! = b;  
    printf("a! =b的结果:%d\n", c);        //输出1
    
    c = 10 > 5;
    printf("10 > 5? %d\n", c);           //输出1
    
    c = 10 < 5;
    printf("10 < 5? %d\n", c);           //输出0
    
    //0x10000000不为0,为真,赋值为true
    a = 0x10000000;
    printf("a = %d\n", a);                //输出1
    
    //0==0,为假,赋值为false
    b = 0.0;
    printf("b = %d\n", b);                //输出0
}
字符类型

字符类型的关键字char,用于存储字母、数字和一些特殊符号。

char a = 'a';

注意事项:

  1. 字符常量的定界符为单引号,即只能用单引号括起来,不能用双引号或其他符号。

  2. 一对单引号中只能包括一个字符,不能是多个字符。

  3. 字符可以是ASCII码中的任意字符。

char也分有符号和无符号。

char型数据取值范围为-128~127,unsigned char型数据取值范围为0~255。

#include <stdio.h>
#include <limits.h>

int main(int argc, const char * argv[])
{
    signed char a = 100;                  //声明了一个带符号8位整数对象a
    signed char b = -10;                  //声明了一个带符号8位整数对象b
    printf("a - b = %d\n", a - b);      //结果输出110

    unsigned char c = 200;                //声明了一个无符号8位整数对象c
    unsigned char d = 50;                 //声明了一个无符号8位整数对象d
    printf("c - d = %d\n", c - d);      //输出结果150

    //输出signed char的最小值
    printf("SCHAR_MIN = %d\n", SCHAR_MIN);

    //输出signed char的最大值
    printf("SCHAR_MAX = %d\n", SCHAR_MAX);

    //输出unsigned char的最大值
    printf("UCHAR_MAX = %d\n", UCHAR_MAX);

    char ch = 'a';                         //声明一个字符对象ch,并用字符’a’对它初始化
    printf("ch = %c\n", ch);             //输出a

    //对于多字符的字符字面量,某些编译器会给出警告
    //这里会将int类型的字符字面量’abc’截取其最低字节’c’给对象ch
    //其他高字节部分被舍弃
    ch = 'abc';
    printf("ch = %c\n", ch);             //输出c

    //这里不会有警告,并且
    //字符a位于对象s的最低字节位置,字符\0位于对象s的最高字节位置
    int s = '\0cba';
    printf("s = %s\n", (char*)&s);      //输出abc

    //八进制数060相当于十六进制数0x30,对应于ASCII码的罗马数字0
    ch = '\060';
    printf("ch = %c\n", ch);             //输出0

    //八进制数0101相当于十六进制数0x41,对应于ASCII码的大写字母A
    ch = '\101';
    printf("ch = %c\n", ch);             //输出A

    ch = '\x42';                            //十六进制数0x42对应于ASCII码中的大写字母B
    printf("ch = %c\n", ch);             //输出B

    //无效的转义符,在Clang中此时ch的值为'8'
    //因为八进制数中的每一位数都是在0到7的范围内
    ch = '\8';

    //无效的转义符,在Clang编译器中直接编译报错
    //因为字母g不是一个能表达十六进制数的有效字符
    ch = '\xg0';

    //输出char类型的最小值
    printf("CHAR_MIN = %d\n", CHAR_MIN);

    //输出char类型的最大值
    printf("CHAR_MAX = %d\n", CHAR_MAX);
}

浮点类型

C语言中有3种实数浮点类型,分别为floatdouble与long double。

C语言标准仅仅规定了float类型的精度是double类型精度的子集;double类型精度是long double精度的子集。

  1. 在十进制浮点数后面添加f或F后缀,表示该字面量是float类型浮点数;

  2. 不添加任何后缀表示double类型浮点字面量;

  3. 添加l或L后缀表示long double类型的浮点字面量。

如果浮点数的小数部分为0,那么我们也可以写为:10.,-5.等形式,10.相当于10.0。

同样,如果整数部分为0,那么我们也可以写作为.25、.1001等形式,.25相当于0.25。

C语言还引入了对浮点数的科学计数法的表示。

//e或E都是一样的意思,不同的写法
3e5   =  3*10^5
3E5   =  3*10^5

6e-3  =  6*10^-3
6E-3  =  6*10^-3

C语言还引入了十六进制浮点表示法,即一个十六进制数跟p或P,再跟一个十进制数,表示p或P之前的十六进制数乘以2p之后的数。

p或P的左边必须是一个十六进制整数或浮点数,p或P的右边必须是一个十进制整数,并且十六进制浮点数表示中,p与指数部分不可缺省。

0x3P2      =  0x3*2^2
0x3.5P-3   =  0x3.5*2^-3

下面介绍一下p的使用,以0x30.8p-2为例

百度AI助手写的。

0x30.8p-2

0x30.8:这是十六进制下的浮点数表示方式,其中0x表示这是一个十六进制数。30是小数点前的部分,而.8是小数点后的部分。

p-2:这是表示指数的部分,其中p代表“power”或“power of”,用于指定指数。这里的-2表示指数是-2。

分离整数和小数部分:

整数部分:0x30(即十进制的48)

小数部分:.8(即十六进制下的0.5,因为8是16的一半)

合并并转换为十进制:

首先将整数部分和带小数部分的十六进制数合并(不包括前面的0x和后面的p-2):30.8

然后转换为十进制:

整数部分:48

小数部分:0.5(因为8在十六进制中是16的一半)

合并后:48 + 0.5 = 48.5

应用指数:

根据指数p-2,我们需要将48.5乘以2的-2次方。

2的-2次方等于0.25(即1/4)。

因此,48.5乘以0.25等于12.125。

最终结果

所以,0x30.8p-2在十进制下等于12.125。

Demo

#include <stdio.h>
#include <float.h>

int main(int argc, const char * argv[]){
    //定义一个单精度浮点数对象f
    float f = -3.5E+3f;  //f的值为3.5 * 1000 = -3500.0。这里的+表示正号,可省
    printf("f = %f\n", f);

    f = .25f;                       //f的值为0.25
    printf("f = %f\n", f);

    f = -0x5p+10f;                 //f的值为-5 * 1024 = -5120
    printf("f = %f\n", f);

    //定义了一个双精度浮点对象d
    double d = -100.;             //d的值为-100.0
    printf("d = %f\n", d);

    d = -1200e-5;                  //d的值为-1200 * 0.00001 = -0.012
    printf("d = %f\n", d);

    d = 0x30.8p-2;                 //d的值为0x30.8 * 0.25 = 48.5 * 0.25 = 12.125
    printf("d = %f\n", d);

    //定义一个long double类型的对象g
    long double g = -0x3.5P0L;  //g的值为-0x3.5 * 1 = -3.3125
    printf("g = %Lf\n", g);

    g = 0x18.F8P2L * 2E3L;       //(24+0.96875)*4 * 2*1000 = 199750.0
    printf("g = %Lf\n", g);

    printf("long double size is: %zu bytes\n", sizeof(g));

    //以下都是用浮点数的科学计数法来打印出各种类型浮点数的最大、最小值
    printf("float min value is: %g\n", FLT_MIN);
    printf("float max value is: %g\n", FLT_MAX);

    printf("double min value is: %g\n", DBL_MIN);
    printf("double max value is: %g\n", DBL_MAX);

    printf("long double min value is: %Lg\n", LDBL_MIN);
    printf("long double max value is: %Lg\n", LDBL_MAX);
}

参考文章

  1. 《C语言编程魔法书:基于C11标准》

  2. 《C语言程序设计:现代方法(第2版)》

  3. 《百度AI助手》

相关文章

暂无评论

none
暂无评论...