C语言基本数据类型(详细)

C语言是一种非常重要的编程语言,在计算机编程领域,它广泛应用于各种开发工作中。学习C语言的一个重要方面就是学习基础数据类型。本文将详细介绍C语言的数据类型,并提供一些实际的使用示例。
C语言

1.整型(int)

取值范围

在计算机系统中,int类型一般采用补码表示法。所以一个长度为32位的int型变量能够表示的整数范围是:-2,147,483,648 到 2,147,483,647。

然而,这只是包括大多数电脑的情况。在不同的计算机架构和编译器下,int类型取值范围可能会略有差异。以下是一些常见的计算机下,int类型可能出现的不同取值范围:

系统int类型取值范围
16位系统-32768 到 32767
32位系统-2147483648 到 2147483647
64位系统-9223372036854775808 到 9223372036854775807

要确保代码在不同的系统上都能正确运行,最好使用标准的数据类型,并且不要对数据类型的大小作出任何假设。如果需要确保int类型的大小为特定值,可以使用C99标准中的stdint.h头文件中定义的具有固定大小的int类型,例如int16_t、int32_t或int64_t。

储存

intl类型
Int类型通常是以二进制的形式存储在计算机的内存中。在32位的操作系统中,一个int类型占用4个字节的内存空间,即32个比特位,可以表示范围为-2147483648到2147483647的整数。

声明

int value;
声明
其他格式:
int value1, value2, value3;

赋值

int value = 233;
创建内存空间并为其赋值

错误示例

1.未给变量赋初值

int a; // 声明一个整型变量a,但没有为其赋初值
printf("%d", a); // 程序将输出当时存储在变量a中的随机数值

输出:4199240(不同环境下不同)
2.将超出范围的值赋给变量

int b = 2147483648; // 错误示例:尝试将一个大于变量能表达的最大值的数字赋给了变量b

printf("%d", b); // 输出结果不可预知,可能会因越界而导致程序运行异常

输出:-2147483648
解释:整数b当到它能表示的最大值时,会重新从起点开始(取值范围可以回看上文)。
3.使用浮点数初始化 int 变量

int c = 3.14159; // 错误示例:使用浮点数作为设定变量c的初值

printf("%d", c); // 输出结果会被截断成整数部分值,即3

输出:3
4.糟糕的初始化格式

int d , e = 13; // 有效,但这种格式很糟糕

printf("%d %d", d, e); // d未初始化,输出结果不可预测

输出:4199256 13
解释:以上代码很容易让人以为d和e都被赋值为13,实则没有。

其他整数类型

C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。

1.short int(short):通常占用2个字节的存储空间(16位),范围从 -32,768 到 32,767。在一些需要大量状态跟踪、但对数字级别需求不高时可以使用,也可用于优化处理特定类型任务。

2.long int(long):通常是4个字节(32位)或8个字节(64位)。其最小值为LONG_MIN(-2147483648),最大值为 LONG_MAX(2147483647)。long int比int同样可以保存整数,因此有一种经常看到的做法是直接声明变量为“long”而不是“long int”,两者等价

3.long long int(long long):占据8个字节(64位)。它表示一个比long int还要大的整数,在必须使用超过现有数据类型所提供的极限时很有用。在C99标准中被正式定义。

4.unsigned int(unsigned):可以存储0到4294967295之间的整数。它和int的存储长度相同,但不保留符号位,所以能够表示的非负整数范围加倍,即为0至4294967295整数范围。

在C90标准中,添加了unsigned long int(unsigned long)和unsigned short int(unsigned short)。在C99标准中,又添加了unsigned long long int(unsigned long long)

总体来说,short int用于那些仅仅需要较低精度控制、针对书写性能较好的场景;long int则可以被视作标准的整数类型,常用作保存数据的容器;而long long int可以看做是更高精度要求下的备选方案,在一些特殊计算中会发挥很好的作用。至于unsigned int,则可以使用在正整数表示相关及性能优化场景内。不同情况下应该根据需求认真选择使用。

2.字符型(char)

char类型是一种非常基础的数据类型,常用于表示单个字符或者整个字符串中的某个字符。在大多数编程语言中,char类型占用1个字节的内存空间,即8个比特位。一个char类型的变量可以表示256种不同的字符,包括小写字母、大写字母、数字、标点符号、空格等等。

储存

但是从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。——《C Primer Plus》

示例
以上是储存在内存中的字母C,在char类型中它表示字母C,在int类型中它表示67,这数字67也叫字母C的ANSIC码值。以下是常见的字符及其ANSIC码值

字符ASCII码值
空格(space)32
数字0~948~57
大写字母A~Z65~90
小写字母a~z97~122
换行符(newline)10
制表符(tab)9

初始化

char a = 'A';

实际上,字符是以数值形式储存的,所以也可使用数字代码值来赋值。——《C Primary Plus》

就例如:

char a = 67;//这样做没问题,相当于char a = 'A';

但这是一种不好的编程风格,用’A’赋值才是更为妥当的做法。

错误示例

char a = A;//错误!此时A是一个变量
char b = "B"//错误!此时"B"是一个字符串

应注意的是,在C语言中,单引号括起来的是一个字符常量,双引号括起来的是一个字符串常量。

3.浮点型(float、double)

浮点类型能表示包括小数在内的更大的数。——《C Primary Plus》

浮点型是C语言中的一种数据类型,用于表示实数数值,即具有小数部分的数。和整数不同,浮点型的数值可以是小数、分数、乘方等形式的。在C语言中,浮点型有两种:单精度浮点数(float)和双精度浮点数(double)。

储存浮点型数据储存方式

浮点型在内存中存储的方式是将浮点数转换成二进制数,再将这些二进制数的位存储在内存中。浮点数通常由三部分组成:符号,尾数和指数。

单精度浮点数(float)和双精度浮点数(double)

单精度浮点数float通常占用4个字节(32比特位)的内存,双精度浮点数double则通常占用8个字节(64比特位)的内存。一般来说,使用double可以获得更高的精度,但同时也会消耗更多的内存。由于内存对于程序的性能影响非常大,所以在选择使用哪种类型的浮点数时,需要权衡精度和内存的需求

值得注意的是,由于计算机在处理浮点数时通常会出现精度误差,所以在精度要求较高的情况下,有时候需要使用特殊的算法或库来解决精度问题。

浮点类型取值范围
float类型1.175494e-38 ~ 3.402823e38
double类型2.225074e-308 ~ 1.797693e308

声明

浮点型变量与整形变量初始化方式相同。

float a, b;
float c;
double d, e;
double f;

赋值

a = 1.0E+12;
b = 2.0e+12;

下面是一些浮点型常量的示例:

3.141596
.2
4e16
.8e16
.8E-5
100.

注意:不要在浮点型常量中加空格,例如1.12 E+12(错误!)
还有一些特殊的浮点型常量:

-INFINITY//无穷大
1.0 / 0.0 // 正无穷大
-1.0 / 0.0 // 负无穷大
0.0 / 0.0 // NaN

INFINITY是表示负无穷大的一个特殊符号。它通常出现在一些特殊计算中,例如某些超限比较或除以0的操作。在C语言中,除以0的结果是无穷大,而正数除以负数的结果是负无穷大,负数除以正数的结果是负无穷大。此外C语言还有定义一个NaN(Not a Number),在处理无穷大除以无穷大时它会出现。

4._Bool类型

bool类型是一个表示逻辑真假的数据类型,它只有两个取值:true(真)和false(假)。在C语言中,bool类型是由C99标准引入的,通常被定义为1个字节(8位),其中0代表false,非0代表true。

使用bool类型可以使代码更具可读性和可维护性,因为bool类型能够直接表示逻辑真假。例如,代码中的条件表达式(例如if语句、while语句)可以直接使用bool类型变量作为条件。在代码中使用bool类型可以明确表示这个变量是一个逻辑真假值,防止出现不必要的错误。

它可以这样初始化:

// 初始化变量
_Bool flag = 1;
_Bool flag = 0;
//上下两者等价
_Bool flag = true;
_Bool flag = false;

5.复数和虚数类型

_Complex类型:

这是C语言中的一种特殊类型,可以表示复数类型的浮点数。_Complex类型包含real和imag两部分,分别表示实部和虚部。它是C99标准中新增的特性,可以在合适的开发环境下使用。

_imaginery类型:

_imaginery这也是C语言中的一个特殊内置类型,在C99标准中引入。它用于表示一个虚数,并且可以进行基本的算术运算。使用它时需要包含头文件complex.h。

各数据类型储存范围

C语言中所有数据类型储存范围的表格总结:

数据类型大小(字节)取值范围(有符号)取值范围(无符号)
char1-128 到 1270 到 255
signed char1-128 到 127-
unsigned char1-0 到 255
short2-32,768 到 32,767-
unsigned short2-0 到 65,535
int4-2,147,483,648 到 2,147,483,647-
unsigned int4-0 到 4,294,967,295
long4-2,147,483,648 到 2,147,483,647-
unsigned long4-0 到 4,294,967,295
long long8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807-
unsigned long long8-0 到 18,446,744,073,709,551,615
float41.2E-38 到 3.4E+38-
double82.2E-308 到 1.8E+308-
long double163.4E-4932 到 1.1E+4932-

sizeof是C语言的内置运算符,以字节单位给出指定类型的大小,C99和C11提供%zd转换说明匹配sizeof的返回类型。输入以下代码,会列出当前系统的各类型的大小:

#include <stdio.h>

int main()
{
	printf("%13s类型的大小为:%zd字节\n", "short",sizeof(int));
	printf("%13s类型的大小为:%zd字节\n", "long int",sizeof(long int));
	printf("%13s类型的大小为:%zd字节\n", "long long int",sizeof(long long int));
	printf("%13s类型的大小为:%zd字节\n", "short int",sizeof(short int));
	printf("%13s类型的大小为:%zd字节\n", "char",sizeof(char));	
	printf("%13s类型的大小为:%zd字节\n", "float",sizeof(float));	
	printf("%13s类型的大小为:%zd字节\n", "double",sizeof(double));	
	printf("%13s类型的大小为:%zd字节\n", "long double",sizeof(long double));	
	printf("%13s类型的大小为:%zd字节\n", "_Bool",sizeof(bool));	
	return 0;
}

作者也正在学习中,文章中的不足之处读者可以在评论区指出,QQ:2685240198。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值