整形在内存中的存储的方式
文章目录
介绍一个被误会的操作符—— sizeof
-
sizeof 计算大小,单位字节 的操作符
-
我们的 sizeof 是操作符,不是函数;主要是因为它打上了,括号( ),被误会了,
-
其实我们也可以不使用括号的,因为它是操作符,但是不建议;带上括号,这是代码的好风格。
#include<stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
- 结果:
类型的意义
- C语言中为何要有类型:
- 本质上内存进行合理的划分,按要求索取,减少内存空间的浪费,毕竟,所有程序的运行都需要在内存中的,内存弥足珍贵。
- 类型为什么在C中有这么多种:
- 应用场景不同,解决应用场景计算机方式不同得的不同,比如:整形计算,字符计算…等,需要空间的大小也不一样的,本质:就是用最小的成本解决各种多样化的场景问题。
整形的存放
原码,反码,补码
- 原码 :直接将数值按照二进制的规则翻译成二进制就可以了,注意负数的符号位。
- 反码 :将原码符号位不变,其他位,按位取反
- 补码 :反码 + 1 就是可以得到补码,注意,符号位也要加到。进位的,只是一般我们进位不到符号位
补码
- 在计算机中,整形数值一律用补码表示和存储。原因在于,使用补码,可以将符号位和数值统一处理,同时,加法和减法也可以统一处理 (CPU只有加法器)。+(-)
- 此外,补码与原码相互转换,其运算过程是相同的,不需要额外附加硬件电路,节约成本。
负数的存放表示:
- 这里主要讲解的是负数的形式
- 因为正数的 原码=反码=补码
补码转原码的两种方法:
方法一:
- 将补码 - 1
- 符号位不变,取反
方法二:
- 按原码变补码的方法来一遍
- 符号位不变,按位取反
- 反码 + 1
- 这种方法更好一些因为,这是计算机的一个原理:计算机只要一个电路,就可以实现,原码反码补码的相互转换的功能,大大节约了成本。
代码实践:
- 请好好理解一下下面的代码:
#include<stdio.h>
int main()
{
unsigned int num1 = -10;
signed int num2 = -10;
printf("num1 =%d\n", num1); // -10
printf("num2 =%d\n", num2); // -10
printf("num1 =%u\n", num1); // 4294967286
printf("num2 =%u\n", num2); // 4294967286
return 0;
}
- 结果:
解析:
- 通过上述代码,以及相应的结果的反馈
- 我们发现
- 无论是我们使用 无符号类型(unsigned)的变量,还是有符号类型(signed) ,存放一个 负数 ( -10),我们使用打印格式 %d 的结果都是 -10 ;
- 无论是我们使用 无符号类型(unsigned)的变量,还是有符号类型(signed) ,存放一个 负数 ( -10),我们使用打印格式 %u 的结果都是非常大的数 4294967286;
- 那么这里的变量类型什么时候有效果的
- 变量存的过程:
- 存:字面数据必须转成二进制补码,再放入内存空间当中,所以,所谓的符号位(正,负 )完全看数据本身是否携带 + — 号,和类型变量的有无符号(signed,unsigned)无关!
- 变量取的过程:
- 取:取数据一定要先看变量本身的类型,然后才决定要不要看最高符号位,如果不需要,直接二进制。如果需要侧需要将补码转成原码,然后才能识别
- 变量存的过程:
- 上述代码 第 9 ~ 10 代码的 图解:
二进制快速转换的口诀:
最后:
每博一文案:
师傅说,信任就像一把刀,在你决定把它交出去之前,要学会认清对面的人,交给对的人,他会保护你,交给错的人只会伤害你,要认清一个人。
—————— 一禅心灵庙语
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善!谢谢大家,后会有期,江湖再见!