1.数据类型详细介绍
C语言中有多种数据类型,这些类型可以用于存储不同种类的数据。以下是C语言中的一些基本数据类型:
-
整数类型:
int
:整数类型,通常表示为32位。short
:短整数类型,通常表示为16位。long
:长整数类型,通常表示为32位(或64位,取决于编译器和平台)。long long
:很长的整数类型,通常表示为64位。
-
字符类型:
char
:字符类型,通常表示为8位。
-
浮点数类型:
float
:单精度浮点数,通常表示为32位。double
:双精度浮点数,通常表示为64位。
-
无符号整数类型:
unsigned int
:无符号整数类型,与int
相同但只包含非负值。unsigned short
:无符号短整数类型。unsigned long
:无符号长整数类型。unsigned long long
:无符号很长的整数类型。
-
其他类型:
void
:表示没有类型或没有值的类型。bool
:C99及以后版本引入的布尔类型,可以使用头文件<stdbool.h>
。
-
自定义类型:
-
结构体 (
struct
):- 结构体允许你将不同类型的数据组织在一起,形成一个新的数据类型。示例:
struct Point { int x; int y; };
- 结构体允许你将不同类型的数据组织在一起,形成一个新的数据类型。示例:
-
联合体 (
union
):- 联合体允许你在相同的内存位置存储不同的类型,但只能同时使用其中的一个成员。示例:
union Data { int i; float f; char c; };
- 联合体允许你在相同的内存位置存储不同的类型,但只能同时使用其中的一个成员。示例:
-
枚举 (
enum
):- 枚举定义了一组有名字的整数常量,可以用于提高代码的可读性。示例:
enum Day { SUNDAY, MONDAY, TUESDAY, // ... };
- 枚举定义了一组有名字的整数常量,可以用于提高代码的可读性。示例:
-
这些数据类型可以用于声明变量,函数的参数和返回值类型,以及其他各种程序中需要指定数据类型的地方。不同的数据类型有不同的取值范围和内存占用大小。
2.整型在内存中的:原码,反码,补码
整型在内存中以补码的方式存在
正数原码反码补码相同
正数:
假设我们有一个正数 +5:
- 原码:
00000101
- 反码:
00000101
- 补码:
00000101
而负数的原码最高位用1表示负号,其他位与一个相同正数原码相同,反码在原码的基础上符号位不变0变1,1变0,补码就是在反码的基础上加1
负数:
假设我们有一个负数 -5:
- 原码:
10000101
- 反码:
11111010
- 补码:
11111011
总结:原反补码是为了方便进行有符号数运算而产生的,具体怎么实现不展开说了
3.大小端字节介绍及其判断
假设存在一个数十六进制数0xff ff ff f9(只是以十六进制呈现内存中还是以二进制补码的方式存在)
#include<stdio.h>
int main()
{
int a = 0xfffffff9;
//ff ff ff ff f9
//高字节-》低字节
return 0;
}
大端存储(Big-endian):
在大端存储中,数据的高字节(Most Significant Byte,MSB)存储在低地址,而低字节(Least Significant Byte,LSB)存储在高地址。这样,多字节数据的起始地址是其最高有效字节的地址。
在大端存储中,存储顺序为:ff ff ff f9
小端存储(Little-endian):
在小端存储中,数据的低字节(LSB)存储在低地址,而高字节(MSB)存储在高地址。这样,多字节数据的起始地址是其最低有效字节的地址。
在小端存储中,存储顺序为:f9 ff ff ff
- x86及x86-64体系结构: 大多数个人计算机和服务器使用小端存储。
- PowerPC和大多数RISC体系结构: 通常使用大端存储。
4.浮点型在内存中的存储解析
浮点数在内存中的存储通常遵循 IEEE 754 浮点数标准,这是一种广泛应用的浮点数表示方法。IEEE 754 标准定义了两种浮点数格式:单精度(32 位)和双精度(64 位)。以下是浮点数在内存中的存储结构:
单精度浮点数 (32 位):
一个单精度浮点数由 32 位二进制表示,按照如下格式存储:
s eeeeeeeeeee mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
其中:
浮点数的存储结构允许表示很广范围的数字,并且在不同数量级之间具有较高的精度。这种表示方式也可以处理无理数和很小或很大的数字,使其成为科学计算、图形学等领域的标准。
- 符号位(1 位): 0 表示正数,1 表示负数。
- 指数部分(8 位): 用于表示幂的指数部分。
- 尾数部分(23 位): 用于表示浮点数的小数部分
- s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
- s(符号位): 0 表示正数,1 表示负数。
- e(指数部分): 用偏移值表示指数,实际指数为 e + 127(e为实际值,e+127为存在内存中的偏移值)。
- 注意点:当8位指数部分全为0时意味着这个数是一个接近0的数字m不会加上原来的1,当8位指数部分全为1时意味着这是无穷大的数字,正负号由符号位决定。
- 补充:引进中间数(e+127)这种概念是为防止负数的出现,因为负数在二进制中还需要考虑符号的概念不方便实现
- m(尾数部分): 小数部分的二进制表示。
- 注意点:1<m<2简单来说就是把一个浮点数通过移位成1.???例如101.1就会在内存中就是
- 1.011*2^2,且前面固定会有一个1所以在存储时省略取出时加上,所以在内存中则是0 10000001 01100000000000000000000
-
双精度浮点数 (64 位):
一个双精度浮点数由 64 位二进制表示,按照如下格式存储:
- 符号位(1 位): 0 表示正数,1 表示负数。
- 指数部分(11 位): 用于表示幂的指数部分。
- 尾数部分(52 位): 用于表示浮点数的小数部分。
- s(符号位): 0 表示正数,1 表示负数。
- e(指数部分): 用偏移值表示指数,实际指数为 e + 1023(e为实际值,e+1023为存在内存中的偏移值)。
- m(尾数部分): 小数部分的二进制表示。
- 双精度与单精度类型所以不予补充