目录
1、C语言数据类型
2、变量的命名规则
3、最冤枉的关键字——sizeof
4、signed和unsigned
原、反、补
深入理解变量内容的存入和取出
大小端
在学习C语言数据类型之前,我们得先了解:为什么要有类型? 类型为什么有这么多种类?
①为什么要有类型?
答:类型本质是对内存进行合理化划分,按需索取
② 类型为什么有这么多种类?
答:应用场景不同,解决应用场景对应的计算方式不同,需要空间的大小也不同。 (本质:用最小成本,解决各种多样化的场景问题)
了解这两个问题之后我们也就知道了 变量定义:是什么?为什么?怎么办?
定义变量格式:类型 变量名 = 初始化;
(定义变量时 :类型决定了变量需要开辟多大内存空间)
辅助理解: 数据类型跟制作月饼模具很类似
如果我们要制作一个小月饼,我们肯定会运用小模具去制作,不会去用大模具去应用,原因是因为小模具可以制作不会造成空间浪费,大模具会造成空间浪费。
数据类型也是如此 如果我们要存储一个字符我们会选择运用 char 类型去存储,不会想着用 int 类型,因为一个字符只占一个字节,刚好 char 类型也只开辟一个字节,而 int 类型开辟4个字节就会造成空间浪费
那我们接来下我们学习一下C语言中常见的内置内类的大小:
为什么 long 跟 int 占用的空间一样大?
为什么说它是最冤枉的关键字?
sizeof是关键字不是函数,但是还是会有人认为它是函数。因为我们大部分使用它的时候后面会跟括号 例如:sizeof(int),函数的使用方法也是这样。
那下面我们一起来为这个关键字洗清冤屈吧,证明它不是函数吧!
我们用编译器来证明它是关键字不是函数:
从哪看出来它不是函数而是关键字的了?为什么第三个 printf ( ) 会报错了?
将第三个printf( )屏蔽后,程序也就可以正常运行了。
注:sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型大小时不能省略。
一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的
那么整型数据在所开辟的内存中是如何存储的了?
①有符号数
int a = 10;
int b = -10;
有符号数可以分为正数和负数
计算机内存储的整型必须是补码,由此我们便引出了原、反、补码的概念
正数的原码、反码、补码相同
负数的原码、反码、补码不相同,故负数的原码、反码、补码需要相互转换
任何数据在计算机中,都必须被转化成二进制,这是为什么呢?
答:因为计算机只认识二进制
计算机内存储的整型为什么必须是补码?
答:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同 时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不 需要额外的硬件电路
原码、反码、补码三种表示方法均有符号位和数值位两部分
例1:signed int a = 10
先将字面值转为补码,然后把补码放入变量 a 中
原码:00000000 00000000 00000000 00001010
因为 10 为正数,故 原码、反码 相同
反码:00000000 00000000 00000000 00001010
补码:00000000 00000000 00000000 00001010
例2:signed int a = -10
先将字面值转为补码,然后把补码放入变量 a 中
原码: 10000000 00000000 00000000 00001010
因为 -10 为负数,故 原码、反码 不相同
反码: 11111111 11111111 11111111 11110101
补码: 11111111 11111111 11111111 11110110
注:在vs中基本类型如果不带 signed 和 unsigned,默认都是有符号的,但是在其他编译器里面就不一定了(大部分不带都是表示有符号的)
补码转原码
方法一:补码 -1 = 反码 反码取反 = 原码
例如:
补码:11111111 11111111 11111111 11101100
反码:11111111 11111111 11111111 11101011
原码:10000000 00000000 00000000 00010100
方法二:补码符号位不变其他位按位取反,然后+1=原码
好处:可以使用一条硬件电路,完成转换
例如:
补码:11111111 11111111 11111111 11101100
10000000 00000000 00000000 00010011
原码: 10000000 00000000 00000000 00010100
②无符号数
没有符号位,也就说明了 原码 = 反码 = 补码,那我们在取一个无符号整型变量时 也就可以直接取
例如:unsigned int a = -10
原码: 10000000 00000000 00000000 00001010
反码: 11111111 11111111 11111111 11110101
补码: 11111111 11111111 11111111 11110110
把 -10 的补码存入 无符号整型 a 中,在读取 a 变量里面的值时默认它是无符号的 直接将它里面存的数值转换为十进制打印。
我们可以通过上图发现在给变量赋值时顺序是十六进制12345678,但在内存中显示的十六进制的顺序却相反了,由此我们可以引入一个概念 大小端
int a = 0x12345678
大小端就是把高权值放在高地址处还是低地址处的问题?
但是无论怎么放,只要用同等条件去取都可以
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中
最后祝大家端午安康!