入门-C编程基础部分:4、数据类型
飞书文档https://x509p6c8to.feishu.cn/wiki/PlQUw29twilDDRkeBfHcqbIwnLg
数据类型的作用:
根据业务需要,存储不同的数据类型
#include <stdio.h>int main(){//1-200kgunsigned char weight = 60;//idunsigned long id = 202502301;float height = 1.9f;printf("weight = %d kg\n",weight);printf("id = %ld \n",id);printf("height = %0.1f \n",height);return 0;
}
整数类型
下表列出了关于标准整数类型的存储大小和值范围的细节:
类型 | 存储大小 | 值范围 |
char | 1 字节 | -128 到 127 或 0 到 255 |
unsigned char | 1 字节 | 0 到 255 |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字节 | 0 到 4,294,967,295 |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。
以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。下面的实例演示了获取 int 类型的大小:
#include <stdio.h>int main()
{int intsize = sizeof(int);printf("int 存储大小 : %d \n", intsize);return 0;
}
最终打印为:
int 存储大小 : 4
出现中文乱码,可以修改文件编码为GBK,点击vscode右下角,修改UTF8为GBK
如果希望不仅对本文件生效,可以点击File->Preferences->settings,输入encoding,修改utf-8为GBK
整数类型示例
#include <stdio.h>int main()
{char a = -10;unsigned char b = 10;short c = 32760;unsigned short d = 65534;printf("a : %d \n", a);printf("b : %d \n", b);printf("c : %d \n", c);printf("d : %d \n", d);return 0;
}
浮点类型
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
类型 | 存储大小 | 值范围 | 精度 |
float | 4个字节(32位) | -3.40E+38~3.4E+38 | 6 位有效位 |
double | 8个字节(64位) | -1.79E+308~-1.79E+308 | 15 位有效位 |
Double和Float都是浮点数类型,但是Double的精度比Float更高。
如果需要进行高精度计算,或者需要表示非常大或非常小的数,建议使用Double类型。而如果需要节省内存空间,或者对精度要求不高,则可以使用Float类型。
数值范围说明:
float和double的范围是由指数的位数来决定的。float的指数位有8位,double的指数位有11位,如下:
float | 1bit(符号位) | 8bit(指数位) | 23bit(尾数位) |
double | 1bit(符号位) | 11bit(指数位) | 52bit(尾数位) |
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
其中负指数决定了浮点数所能表达的绝对值最小的非零数,而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;
double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
科学计数法的说明:
3.4E+38是科学计数法的表示方式. |
精度说明
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
为什么说绝对能保证的为6位,这是因为精度与舍入误差造成的: |
有效位说明:
6位有效位,注意不是小数的位数,是以第一个非0数字开始数6位 |
以下是一些示例:
如果您需要存储一个小数点后只有一位的数字,例如温度计度数,您可以使用float类型。例如,您可以使用以下代码声明一个float类型的变量: |
例程:
#include <stdio.h>int main()
{float a = 123.12f; //初始化float时,需要在数值后添加f,否则会被默认初始化位doubledouble b = 0.12345678912345678;printf("float : %.2f \n", a);printf("double : %.20f \n", b);return 0;
}
它会产生下列结果:
float : 123.12
double : 0.12345678912345678000
void 类型
void 类型指定没有可用的值。它通常用于以下两种情况下:
序号 | 类型与描述 |
1 | 函数返回为空 C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); |
2 | 函数参数为空 C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); |
关于printf打印的占位符参考:
【C语言】 全面解析占位符-CSDN博客