目录
一、前言
基本数据类型和变量的定义在任何编程语言中都是非常基础且非常重要的知识点, 需要熟练掌握, 能够灵活运用. 本文将介绍C语言的常用数据类型及变量的定义方法.
二、基本数据类型的介绍
2.1 整型
整型, 顾名思义, 就是整数类型. 下面逐一介绍C语言中整型数据的关键字.
关键字 | 名称 | 取值范围(x64) |
---|---|---|
int | 整型 | -2,147,483,648 ~ 2,147,483,647 |
unsigned int | 无符号整型 | 0 ~ 4,294,967,295 |
long int | 长整型 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned long int | 无符号长整型 | 0 ~ 18,446,744,073,709,551,615 |
long long int | 加长整型 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned long long int | 无符号加长整型 | 0 ~ 18,446,744,073,709,551,615 |
short int | 短整型 | -32,768 ~ 32,767 |
unsigned short int | 无符号短整型 | 0 ~ 65,535 |
char | 字符型 | -128 ~ 127 |
unsigned char | 无符号字符型 | 0 ~ 255 |
其中, unsigned关键字意为"无符号", 即取值范围大于等于0, 没有负号.
注意事项: 定义变量时变量的值一定要在该变量的数据类型所对应的数据范围之内, 否则会造成数据溢出, 导致程序出错.
其实数据类型的数据范围不需要刻意去记忆, 用到时可以凭感觉选择一个数据类型, 如果报错可以查看报错内容, 适当地修改数据类型. 因为在某些平台上取值范围可能是不同的.
2.2 浮点型
浮点型, 顾名思义, 就是表示小数的数据类型. 下面逐一介绍C语言中浮点型数据的关键字.
关键字 | 名称 | 取值范围(x64) | 有效数字 |
---|---|---|---|
float | 单精度浮点型 | 3.4E-38 到 3.4E+38 | 6 - 9位 |
double | 双精度浮点型 | 2.3E-308 到 1.7E+308 | 15 - 17位 |
long double | 拓展精度浮点型 | -1.2E-4932~1.2E+4932 | 18 - 19位 |
注意: 精度范围依赖于不同的平台, 具体依实际情况而定.
2.3 void 类型
void类型, 即"空"类型, 它可以在函数返回值为空时使用, 也可以在函数参数为空时使用.
示例:
void func() {} // 函数返回值为空
int func(void) {} // 函数参数为空
void func(void) {} // 函数返回值和参数都为空
提示: 不了解函数的同学可以点击链接查看介绍函数的博文[C语言] 函数
2.4 其它类型
关键字 | 名称 | 解释 |
---|---|---|
_Bool 或 bool | 布尔值 | 取值为True/False, 即 真/假 |
_Complex 或 complex | 复数类型 | 用于处理复数数据 |
三、变量的定义
变量, 即可变的量, 在程序中可以被二次赋值. 变量在程序中是不可或缺的, 它可以帮助我们完成很多功能. 下文将介绍有关变量的内容.
3.1 变量定义的基本格式
格式: 变量类型 变量名 = 变量值;
3.2 举例
要求: 定义一个变量名为num, 变量值为10, 且变量类型为int类型的变量.
代码:
int num = 10;
四、sizeof()
函数的用法
使用sizeof()
函数可以返回某个类型或某个变量在特定平台上的准确大小, 一般返回值的单位为字节. sizeof()函数包含在stdio.h头文件中, 要提前包含进来. 下面来看一个例子:
例: 获取int类型的大小:
#include <stdio.h>
int main()
{
printf("int 类型的大小: %zu\n", sizeof(int));
return 0;
}
输出;
可以看出, int类型在当前平台上的大小为4个字节.
其中, sizeof()函数的返回值为size_t类型, 因此要使用%zu占位符, 在某些版本下也可以使用%lld或%zd占位符.
提示: 不了占位符的同学可以点击链接查看介占位符的博文[C语言] printf()函数及占位符的使用
五、数据类型的强制转换
通常情况下, C语言只能是相同类型的数据做计算, 不同类型的数据是不能做计算的.
例1: 两个不同类型的数据做加法
#include <stdio.h>
int main()
{
double sum = 2 + 2.1; // 当两个不同数据类型的数据做加法
printf("sum = %.5f", sum); // 精确到小数点后5位
return 0;
}
在较新版本的编译器下, 这段代码不会报错, 可以正常输出结果:
这是因为C语言的自动类型转换的机制, 也叫隐式类型转换. 变量sum为double类型, 数字2.1保持double类型, 数字2自动从int类型提升为double类型, 最终计算输出double类型的结果.
如果我们将变量sum的类型改为float会怎样呢?
例2 将接收加法结果的变量数据类型改为float:
#include <stdio.h>
int main()
{
float sum = 2 + 2.1; // 当两个不同数据类型的数据做加法
printf("sum = %5f", sum); // 精确到小数点后5位
return 0;
}
编译后报错:
我们看看警告信息: warning: conversion from ‘double’ to ‘float’ changes value from ‘4.0999999999999996e+0’ to ‘4.0999999e+0f’ [-Wfloat-conversion]
大意就是说我们double类型转换到float类型会损失精度. 但也可以正常运行:
出现这种警告就是做加法的两个数和接收加法结果的变量的数据类型不符合导致的. 这种情况下是没有自动类型转换的. 那么要怎样避免出现这种警告呢? 这就要说到强制类型转换了.
格式: (要转化成的变量类型)变量;
那么如果要用到强制类型转换的话, 要如何修改例2的代码呢?
来看看下面这段代码:
#include <stdio.h>
int main()
{
float sum = (float)2 + (float)2.1; // 将两个做加法的变量强制转化为float类型的数据.
printf("sum = %.5f", sum); // 精确到小数点后5位
return 0;
}
这样编译后就没有警告信息了
看看运行输出结果:
这样就能正常运行了.
强制转换数据类型时, 为了减少精度的损失, 尽量将数据往更高精度的数据类型转换. 例如int类型可以转化为float/double类型, 而double类型就不要转化为int类型了, 这样会造成精度损失过多. 当然, 最好还是尽量少用强制类型转换.