C语言——数据类型

目录

一、引言

 二、进制与转化

2.1 进制的定义

2.2 位权展开式

2.3进制之间的转化

2.3.1十进制→二进制/八进制/十六进制

2.3.3二进制与八进制 / 十六进制的快速转换

 二进制 ↔ 八进制

三、基础数据类型

3.1 整型(Integer Types)

3.2 浮点型(Floating-Point Types)

3.3 字符型(Character Types)

 四、数据类型的具体存储方式

4.1 内存的基本单位

4.2 内存地址

4.3整型的存储:原码、反码、补码

4.3.1 有符号整型的存储

4.3.2 无符号整型的存储

4.3.3整型类型数据溢出

4.4浮点型的存储:IEEE 754 标准

4.4.1 单精度浮点型(float,32 位)

4.4.2 双精度浮点型(double,64 位)

4.5字符型的存储:ASCII 与扩展编码

4.5.1 ASCII 码存储

4.5.2 有符号与无符号字符型

4.6数据存储的字节序:大端与小端


一、引言

在 C 语言的世界里,数据类型是构建程序的基石。它决定了数据在内存中的存储方式、取值范围以及可执行的操作。

 二、进制与转化

在计算机科学和编程中,我们经常需要在不同进制(如二进制、八进制、十进制、十六进制)之间进行转换。理解进制转换的原理和方法,是编写高效代码、解决底层问题的基础。本文将详细介绍进制转换的核心概念、转换算法及其代码实现。

2.1 进制的定义

进制是一种计数方式,不同进制的区别在于基数(每一位的可能取值数目)和进位规则:

  • 十进制:基数为 10(0-9),逢十进一。

  • 二进制:基数为 2(0-1),逢二进一。

  • 八进制:基数为 8(0-7),逢八进一。

  • 十六进制:基数为 16(0-9,A-F),逢十六进一。

2.2 位权展开式

任何进制的数都可以用位权展开式表示,例如:

  • 十进制数 123.45 = 1×10² + 2×10¹ + 3×10⁰ + 4×10⁻¹ + 5×10⁻²

  • 二进制数 101.1 = 1×2² + 0×2¹ + 1×2⁰ + 1×2⁻¹ = 5.5(十进制)

2.3进制之间的转化

2.3.1十进制→二进制/八进制/十六进制

整数部分

不断除以目标进制的基数,记录余数。

直到商为 0,将余数倒序排列。

小数部分

不断乘以目标进制的基数,记录整数部分。

直到小数部分为 0 或达到精度要求,将整数部分顺序排列。

示例:十进制 25.625 → 二进制

  • 整数部分:25 ÷ 2 = 12...1 → 12 ÷ 2 = 6...0 → 6 ÷ 2 = 3...0 → 3 ÷ 2 = 1...1 → 1 ÷ 2 = 0...1
    余数倒序:11001

  • 小数部分:0.625 × 2 = 1.25 → 0.25 × 2 = 0.5 → 0.5 × 2 = 1.0
    整数顺序:101

  • 结果:11001.101

2.3.2二进制 / 八进制 / 十六进制 → 十进制

按位权展开式计算即可。

示例

  • 二进制 1101.1 → 1×2³ + 1×2² + 0×2¹ + 1×2⁰ + 1×2⁻¹ = 8 + 4 + 0 + 1 + 0.5 = 13.5

  • 十六进制 0x2A → 2×16¹ + 10×16⁰ = 32 + 10 = 42

2.3.3二进制与八进制 / 十六进制的快速转换

 二进制 ↔ 八进制

  • 二进制 → 八进制:每 3 位二进制数对应 1 位八进制数(不足 3 位补零)。
    示例:110101.1 → 011 010 1.100 → 32.4(八进制)

  • 八进制 → 二进制:每 1 位八进制数展开为 3 位二进制数。
    示例:75.2 → 111 101.010 → 111101.01(二进制)

二进制 ↔ 十六进制

  • 二进制 → 十六进制:每 4 位二进制数对应 1 位十六进制数(不足 4 位补零)。
    示例:110101.1 → 0011 0101.1000 → 35.8(十六进制)

  • 十六进制 → 二进制:每 1 位十六进制数展开为 4 位二进制数。
    示例:0x2A.F → 0010 1010.1111 → 101010.1111(二进制)

三、基础数据类型

C 语言的基础数据类型可分为四大类:整型、浮点型、字符型和空类型。它们是 C 语言中最核心、最常用的数据类型。

3.1 整型(Integer Types)

整型用于存储整数数值,根据取值范围和字节数的不同,分为以下几种:

类型名称 关键字 字节数(32 位系统) 取值范围
短整型 short 2 -32768 ~ 32767
整型 int 4 -2147483648 ~ 2147483647
长整型 long 4 int相同(部分系统为 8 字节)
长整型 long long 8 -9223372036854775808 ~ 9223372036854775807
无符号短整型 unsigned short 2 0 ~ 65535
无符号整型 unsigned int 4 0 ~ 4294967295
无符号长整型 unsigned long 4 0 ~ 4294967295(部分系统为 8 字节)
无符号长整型 unsigned long long 8 0 ~ 18446744073709551615

特点与应用

  • 有符号整型:默认存储带符号整数,最高位为符号位(0 正 1 负)。

  • 无符号整型:所有位均用于存储数值,适用于非负数场景(如计数、地址偏移)。

  • 选择建议:根据数值范围选择合适类型,避免溢出(如用long long存储大数)。

注:整型常量默认识别为signed int类型 

3.2 浮点型(Floating-Point Types)

浮点型用于存储小数或数值范围极大的数,基于 IEEE 754 标准表示:

类型名称 关键字 字节数 有效位数 取值范围(近似)
单精度浮点型 float 4 6~7 位 ±1.2×10⁻³⁸ ~ ±3.4×10³⁸
双精度浮点型 double 8 15~16 位 ±2.3×10⁻³⁰⁸ ~ ±1.8×10³⁰⁸
长双精度浮点型 long double 8/12 18~19 位 依系统而定

特点与应用

  • 精度差异double精度更高,适用于科学计算、金融数据等场景。

  • 存储方式:以二进制指数形式存储(符号位 + 指数位 + 尾数位)。

  • 注意事项:避免直接比较两个浮点数是否相等(改用差值小于极小值的方式)。

注:同一精度 进行比较 (用同一个数据类型)

3.3 字符型(Character Types)

字符型用于存储单个字符,本质是存储字符对应的 ASCII 码值:

类型名称 关键字 字节数 取值范围
字符型 char 1 -128 ~ 127(有符号)或 0~255(无符号)
无符号字符型 unsigned char 1 0 ~ 255
有符号字符型 signed char 1 -128 ~ 127

特点与应用

  • 字符与数值互通char可当作 8 位整型使用(如存储 0~255 的数值)。

  • 转义字符:用于表示特殊字符(如\n换行、\t制表符、\"双引号)。

转义字符 含义 ASCII 码值(十进制)
\a 警报(响铃) 7
\b 退格(Backspace) 8
\f 换页 12
\n 换行 10
\r 回车 13
\t 水平制表符(Tab) 9
\v 垂直制表符 11
\\ 反斜杠 92
\' 单引号 39
\" 双引号 34
\? 问号(在三字母词中使用) 63
\0 空字符(字符串结束符) 0
\ddd 八进制数表示的 ASCII 字符 0-255
\xhh 十六进制数表示的 ASCII 字符 0-255
  • 字符串存储:字符数组以'\0'(ASCII 码 0)结尾表示字符串(如char str[] = "Hello";)。

 四、数据类型的具体存储方式

在 C 语言中,数据类型不仅决定了数据的取值范围和操作方式,更决定了数据在内存中的存储形式。理解数据的底层存储机制,有助于我们深入掌握变量赋值、类型转换、内存优化等关键技术。

4.1 内存的基本单位

  • 字节(Byte):内存的最小可寻址单位,通常由 8 位(bit)组成。

  • 位(bit):二进制存储的最小单位,取值为 0 或 1。

4.2 内存地址

每个字节在内存中都有唯一的地址(类似门牌号),CPU 通过地址访问数据。

4.3整型的存储:原码、反码、补码

4.3.1 有符号整型的存储

采用补码(Two's Complement)存储有符号整数,规则如下:

正数:补码与原码相同(如int 5的补码为00000000 00000000 00000000 00000101)。

负数:符号位为 1,数值部分按绝对值的原码取反加 1。

例:int -5的补码计算过程:

    原码(32 位):10000000 00000000 00000000 00000101

    取反(符号位不变):11111111 11111111 11111111 11111010

    加 1:11111111 11111111 11111111 11111011(补码)

补码的优势

  • 统一了加减法运算(CPU 只需实现加法器)。

  • 0 的表示唯一(原码中+0-0不同,补码中均为0000...0)。

4.3.2 无符号整型的存储

无符号整型所有位均用于表示数值(无符号位),直接存储二进制值:

  • unsigned int 500000000 00000000 00000000 00000101
  • unsigned int -1:实际存储为4294967295(全 1,即 2³²-1)。

4.3.3整型类型数据溢出

最大值 再加 1 会变为 该范围内的最小值 

最小值 再减 1 会变为 该范围内的最大值

4.4浮点型的存储:IEEE 754 标准

浮点型(float/double)采用 IEEE 754 标准 存储,将数值分解为三部分:

符号位 | 指数位 | 尾数位

4.4.1 单精度浮点型(float,32 位)

  • 符号位(1 位):0 表示正数,1 表示负数。

  • 指数位(8 位):存储指数 + 127 的偏移值(便于表示负数指数)。

  • 尾数位(23 位):存储小数部分,隐含最高位为 1(规格化数)。

示例:存储float 5.5(二进制为101.1):

  1. 规格化101.1 = 1.011 × 2²

  2. 符号位:0(正数)

  3. 指数位:2 + 127 = 129 → 二进制10000001

  4. 尾数位011后面补 0 至 23 位 → 01100000000000000000000

4.4.2 双精度浮点型(double,64 位)

  • 符号位(1 位):同float

  • 指数位(11 位):偏移值为 1023(指数范围 - 1022~+1023)。

  • 尾数位(52 位):隐含最高位为 1,精度更高。

特殊值处理

  • :符号位为 0 表示 + 0,为 1 表示 - 0(IEEE 754 认为两者相等)。

  • 无穷大:指数位全 1,尾数位全 0(符号位决定正负)。

  • NaN(非数):指数位全 1,尾数位非 0(表示无效运算结果,如 0/0)。IEEE754详细介绍可看这篇文章https://blog.csdn.net/weixin_47713503/article/details/108699001

4.5字符型的存储:ASCII 与扩展编码

4.5.1 ASCII 码存储

char类型本质是 8 位整数,存储字符对应的 ASCII 码值:

  • char c = 'A' → 存储65(二进制01000001)。

  • char d = '\n' → 存储换行符的 ASCII 码10

4.5.2 有符号与无符号字符型

  • signed char:范围 - 128~127,最高位为符号位。

  • unsigned char:范围 0~255,可存储扩展 ASCII 码(如俄语、日语字符)或二进制数据(如文件读写中的字节流)。

4.6数据存储的字节序:大端与小端

字节序(Endianness)指多字节数据在内存中的字节排列顺序:

  • 大端序(Big-Endian):高位字节存于低地址,低位字节存于高地址。

  • 小端序(Little-Endian):低位字节存于低地址,高位字节存于高地址。

你可能感兴趣的:(C,c语言,开发语言)