数据在内存中的存储

数据在内存中的存储

数据类型介绍

char //字符
short //短整形
int //整形
long //长整形
long long //更长的整形
float //单精度浮点数
double //双精度浮点数

类型的意义

  1. 使用这个类型开辟的空间的大小(大小决定了使用范围)。

  2. 如何看待内存空间。

类型的基本分类

char:
   //符在内存中存储的是ASCII码值,ASCII码值是整形,所以字符类型属于整形家族。
signed char
unsigned char
short
signed short
unsigned short
int 
signed int
unsigned int
long 
signed long
unsigned long
float
double
> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union
int *pi;
char *pc;
float* pf;
void* pv;
空类型:
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型

整形在内存中的存储

变量的创建是在内存中开辟空间。空间的大小是根据不同的类型决定的。

比如

int a = 20;
int b = -10;

我们知道a分配四个空间。那如何存储呢。先了解一下概念

原码、反码、补码

计算机中有三种二进制表示方法分别为原码反码补码,三种表示方法由符号位数值位组成。符号位用0表示正。用1表示负。符号位为0的原反补相同。为1时的三种表示方法各不相同。

  • 负数的原码:直接按照数值翻译成二进制。符号位为1即可获得原码。

  • 反码:符号位不变。其他位依次按位取反得到反码。

  • 补码:由反码+1得到。

对于整形来说:数据存放在内存中其实存放的是补码

大小端介绍

什么是大端小端: 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中; 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。

百度2015年系统工程师笔试题: 请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)

int test(){
    int a = 1;
    return (*(char*)&a);
}
int main() {
    int a = 20;
    int b = -10;
    if (test())
    {
        printf("小端");
    }
    else {
        printf("大端");
    }
    return 0;
}

将a的地址强制转换成char指针类型。因为char指针一次只能访问一字节数据。&a取出的是a的起始地址。如果结果为1。那么在内存中的就是01000000。否则就是00000001。

练习

int main(){
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}

首先将-1赋给a。 -1的原码为10000000 00000000 00000000 00000001,反码11111111 11111111 11111111 11111110, 补码为11111111 11111111 11111111 11111111。 但是char类型的a只能存放一字节。所以a存放的是-1补码的低八位11111111。b和c同理。存放的也是八个1,有符号数和无符号数在存储的时候是一样的。只有在使用的时候才会有所区别。 然后进行输出。要输出的类型为%d也就是十进制有符号数。要将abc进行整形提升,a与b同为signed char有符号。提升时高位补符号位 最后为11111111 11111111 11111111 11111111。因为输出的是有符号数。所以要将提升后的补码转换为原码也就是10000000 00000000 00000000 00000001。也就是-1。c为无符号类型。整形提升时高位补0,最后为00000000 00000000 00000000 11111111。符号位为0代表正数,正数原反补相同。所以c输出255;

#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}

-128的原码是10000000 00000000 00000000 10000000,反码为11111111 11111111 11111111 01111111,补码为11111111 11111111 11111111 10000000。a只有一字节。所以存储的是10000000。%u为十进制无符号整形。需要的a进行整形提升。a为有符号数补符号位 最后为11111111 11111111 11111111 10000000。由于输出的为无符号数,所以不用转换直接输出11111111 11111111 11111111 10000000的十进制表达4294967168

int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}

128的原反补相同00000000 00000000 00000000 10000000,存入a的为10000000同上。所以输出和上面一样。由此我们可以看出。不要看赋值的是多少。而是他真正存储的是多少。

int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
//按照补码的形式进行运算,最后格式化成为有符号整数

-20的原码为10000000 00000000 00000000 00010100 反码为11111111 11111111 11111111 11101011 补码为 11111111 11111111 11111111 11101100。10的原反补相同,00000000 00000000 00000000 00001010;

11111111 11111111 11111111 11101100 00000000 00000000 00000000 00001010 =11111111 11111111 11111111 11110110(i+j)输出为有符号十进制 需要将补码转换为原码 。结果为-10;

int main(){
    unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
    return 0;
}

输出9-0,然后输出随机数(可通过计算得出)。当i==0的时候,执行i--。i=0-1也就是i=0的补码加上-1的补码。-1的补码是11111111 11111111 11111111 11111111。此时i存储的是11111111 11111111 11111111 11111111,i是无符号数。在使用时直接就用了,所以是个很大的数。

int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}

a[0]=-1 a[1]=-2 从-1到-128,然后127-1一共225个数,所以答案为255。

-128的原码为10000000 00000000 00000000 10000000反码为11111111 11111111 11111111 01111111补码为11111111 11111111 11111111 10000000。-1的补码为11111111 11111111 11111111 11111111

11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000 答案为1 11111111 11111111 11111111 01111111 01111111 放入a[i]也就是127

unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}

i=255时i++,i=255的补码加1的补码

00000000 00000000 00000001 00000000 00000000 00000000 00000000 00000001=00000000 00000000 00000001 00000001。char为一字节取低八位00000001也就是1所以此程序无限输出

FFmpeg是一款功能强大的开源多媒体处理工具,广泛应用于视频和音频的编码、解码、转换以及流媒体处理。然而,由于历史原因和标准限制,原生的FFmpeg并不支持将H.265(高效视频编码)格式的视频流封装到FLV(Flash Video)容器中。FLV是一种常见的网络流媒体传输格式,但其最初设计时并未考虑现代高效的H.265编码标准。因此,当尝试将H.265编码的视频与FLV容器结合时,会出现“Video codec hevc not compatible with flv”的错误提示,表明FFmpeg无法识别这种组合。 为了解决这一问题,开发者通常需要对FFmpeg的源代码进行修改和扩展。一个名为“用于解决ffmpeg不支持flv+h265需要修改的文件.zip”的压缩包中包含了一些源代码文件,这些文件旨在扩展FFmpeg的功能,使其能够处理FLV容器中的H.265编码内容。压缩包中的三个关键文件分别是“flvdec.c”“flvenc.c”和“flv.h”,它们分别对应FLV的解码器、编码器和头文件。 flvdec.c:这是FFmpeg的FLV解码器源代码,经过修改后可能支持读取和解析包含H.265数据的FLV流。解码器的作用是从FLV容器中提取视频数据,并将其转换为可处理的原始像素格式。 flvenc.c:这个文件包含FLV编码器的源代码,经过调整后可能允许将H.265编码的视频流封装到FLV容器中。编码器负责将原始视频数据编码为H.265格式,并将其打包到FLV文件中。 flv.h:这是一个头文件,定义了FLV格式相关的常量、结构体和函数原型。修改该文件可能涉及添加或更新与H.265支持相关的定义和接口。 要应用这些修改,开发者需要重新编译FFmpeg源代码,并将修改后的版本替换原有的FFmpeg安装。这样,用户就可以使用定制版的FFmpeg来处理FLV+H.265的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值