数据在内存中的存储

1.数据类型详细介绍

C语言中有多种数据类型,这些类型可以用于存储不同种类的数据。以下是C语言中的一些基本数据类型:

  1. 整数类型:
    • int:整数类型,通常表示为32位。
    • short:短整数类型,通常表示为16位。
    • long:长整数类型,通常表示为32位(或64位,取决于编译器和平台)。
    • long long:很长的整数类型,通常表示为64位。
  2. 字符类型:
    • char:字符类型,通常表示为8位。
  3. 浮点数类型:
    • float:单精度浮点数,通常表示为32位。
    • double:双精度浮点数,通常表示为64位。
  4. 无符号整数类型:
    • unsigned int:无符号整数类型,与int相同但只包含非负值。
    • unsigned short:无符号短整数类型。
    • unsigned long:无符号长整数类型。
    • unsigned long long:无符号很长的整数类型。
  5. 其他类型:

    • void:表示没有类型或没有值的类型。
    • bool:C99及以后版本引入的布尔类型,可以使用头文件
  6. 自定义类型:
    • 结构体 (struct):

      • 结构体允许你将不同类型的数据组织在一起,形成一个新的数据类型。示例:
        struct Point {
            int x;
            int y;
        };
        

    • 联合体 (union):

      • 联合体允许你在相同的内存位置存储不同的类型,但只能同时使用其中的一个成员。示例:
        union Data {
            int i;
            float f;
            char c;
        };

    • 枚举 (enum):

      • 枚举定义了一组有名字的整数常量,可以用于提高代码的可读性。示例:
        enum Day {
            SUNDAY,
            MONDAY,
            TUESDAY,
            // ...
        };

    7.指针类型

这些数据类型可以用于声明变量,函数的参数和返回值类型,以及其他各种程序中需要指定数据类型的地方。不同的数据类型有不同的取值范围和内存占用大小。

2.整型在内存中的:原码,反码,补码

整型在内存中以补码的方式存在

正数原码反码补码相同

正数:

假设我们有一个正数 +5:

  • 原码: 00000101
  • 反码: 00000101
  • 补码: 00000101

而负数的原码最高位用1表示负号,其他位与一个相同正数原码相同,反码在原码的基础上符号位不变0变1,1变0,补码就是在反码的基础上加1

负数:

假设我们有一个负数 -5:

  • 原码: 10000101
  • 反码: 11111010
  • 补码: 11111011

总结:原反补码是为了方便进行有符号数运算而产生的,具体怎么实现不展开说了

3.大小端字节介绍及其判断

假设存在一个数十六进制数0xff ff ff f9(只是以十六进制呈现内存中还是以二进制补码的方式存在)

#include
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

数据在内存中的存储_第1张图片

  • 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
  • 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(尾数部分): 小数部分的二进制表示。
  • 双精度与单精度类型所以不予补充
  •                                   

你可能感兴趣的:(c语言)