零基础C语言学习

                *c语言学习笔记(十八)*

数据的存储(一)

一、数据的类型
在前面的内容里,已经讨论过数据的基本类型,分为整型和浮点型。
1、整型包含:int ,char,short ,long, long long
浮点型包含:double ,float
上面的统称为内置类型,我们也可以通过宏定义或者typedef来定义自己的数据类型,称为自定义类型。
假设定义一个int型和一个float型,内容均为10,那么他们在内存里的存储是否有区别呢?
答案是肯定的。因为浮点型数据有他自己的特殊存储方式,所以在内存中的存储是有区别的。
2、构造类型(自定义类型)
数组类型
结构体类型 struct
枚举类型 enum
联合体类型 union
3、指针类型
int*
char*
float*
void*(空类型)
4、空类型(void)
void型通常用于函数返回类型,函数参数,指针类型
二、整型在内存中如何存储的问题
定义两个整型变量

int a = 20;
int b = -10;      

首先查看a的内存存储
在这里插入图片描述
下面是b的
在这里插入图片描述
首先,int型的数据会占据四个字节长度,上述图片里面两个数组成的一对为一个字节,由于是十六进制,因次一对数刚好表示八个bit
其次,数据有三种表示形式:原码,反码,补码;
负数的反码为符号位不变,其余位取反,补码等于反码加1
无论是有负号还是无符号数,数据在计算机中都是以补码存储的,无符号数和正数的补码,反码、原码相同;
这样的原因在于:使用补码,可以使符号位和数值位统一处理;同时,加法和减法也可以统一处理(CPU只有加法器),另外,补码与原码相互转换,其运算过程是相同的,不需要额外硬件电路。
注:那么计算机怎么计算减法呢?
在这里,计算机会将减数转换为负数,然后进行相加。那乘法呢?其实也是转换为加法运算

三、大小端问题
什么是大小端对齐?
大端(存储)模式:指数据的低位保存在内存的高地址中,而数据的高位保存在低地址中;
小端(存储)模式:低位低地址,高位高地址;
电脑X86和手机RAM都是小端对齐的;
在上面的例子,定义了a=20;
a的十六进制为:0x140000000
在这里插入图片描述
可以看出是小端对齐的方式。
下面做一道程序题,编写程序确定计算机的大小端对齐模式。
这道题的解题思路,我们可以首先定义一个int型整数,然后使用char型指针来进行操作,通过对指针解引用操作,即可证明大小端问题;
代码如下:

int a = 20;
char* pa =(char*) &a;
//pa += 2;
int b = *pa;
printf("%0xd", b);

当然亦可以通过解引用重新赋值,查看变量a的数值改变情况,也可以完成要求。
在内存中若是大端对齐,这存储顺序为:00 00 00 14
小端对齐为:14 00 00 00
打印结果为:
在这里插入图片描述
可以看出第一个字节内容为14 故我用的计算机为小端对齐方式。若果对此还有怀疑,那么也可以将char型指针后移1-3位,输出的结果都应该是0。
练习二:下面一段代码的输出结果为?

char a = -1;	
signed char b = -1;
unsigned char c = -1;
printf("%d %d %d ", a,b,c);

输出结果为:
在这里插入图片描述
那么为什么是这样的结果呢?
首先给出-1的原码(32位模式)
1000 0000 0000 0000 0000 0000 0000 0001
1111 1111 1111 1111 1111 1111 1111 1110(反码)
1111 1111 1111 1111 1111 1111 1111 1111(补码)
因为我们定义了char类型,所以此时数据会发生一个截断,即只会保留低八位数据。char型默认为有符号数,因此a,b的结果应该相同 为1111 1111,输出结果为-1(反推为-1的原码);
而定义了c为无符号数,则此时补码1111 1111与原码和相同,结果为255;
注意:在输出时,计算机会有一个整型提升过程;是按着有无符号进行区别提升的;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值