C C++最全【C语言】数据类型存储、原码,反码,补码_我去看(我,C C++面试C C++基础

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#include<stdio.h>
int main(void)
{
	int a = 10;
	int* p = &a;				//整形指针变量p接收a的地址
	//这里数据类型全部定义成指针了-- 32位 4byte 64位 8byte
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(double*));
	printf("%d\n", sizeof(char*));
}
  • 运行结果:

空类型

  • 一种特殊的返回类型,表示空函数,也就是没有返回值的函数。空类型(无类型) void 用于显示说明一个函数不返回任何值。还可以说明指向 void 类型的指针,说明以后,这个指针就可指向各种不同类型的数据对象💫
  • void无传参,当你在定义程序的时候加入无传参的时候,虽说程序也会运行起来。但是会有waring提示就是不需要的参数
函数的返回类型☮
#include<stdio.h>
void print()
{
    printf("hello word\n");
}
int main(void)
{
    print();
}
函数的参数☪
#include<stdio.h>
void print()//无参数的话进行传参也是可以的,但是这里没有所以我们C语言并不会进行接收
{
    printf("hello word\n");
}
int main(void)
{
    print(10);//在print函数当中给上参数10
}

整形在内存当中的存储空间

想要了解这个内容的话,我用一段代码给大家演示下:

#include<stdio.h>
int main(void)
{
    int a = 5;
    int b = -3;
}

a存储的结果

b存储的结果

  • 大家发现了没有,这两个的存储结果是不一样的,接下来我就来告诉大家整形在内存当中是怎么存储的。
  • 其实就是先要了解原码,反码,以及补码的概念。
  • 计算机中**有符号数(整形)**有三种表示方法分别是:原码,反码以及补码。三种表示方法都有符号位和数值位两个部分,**符号位是用0表示位"正",用1表示为"负",**而数值位的三种表示方法各不相同。注:无符号的原码反码以及补码是相同的💨。
  • 有符号数字是分为两种的一种叫做正数,另一种叫做是负数。在正数当中是相同的,然而在负数当中这三种的表达方式就不一样了💨
原码:-1 原码:1… 1001 0001
反码:-1 反码:1…1110 0001
补码:-1 补码:1…1111 0111
  • 上面的是负数形式三种情况,…这个是省略如果是整形前面32位数字,注意这里最高位是1,所以是负数的三种形式。
原码
  • 直接将数字按照正数或者负数形式来转换翻译成二进制就可以了💨
int a = 5;//4个字节 —— 32bit位
//0(最高位正数)0000000000000000000000000000101
int b = -3;
//1(最高位负数)1111111111111111111111111111101

其实还有一个办法可以算补码我一开始就是这样的:

1、假设是负数1的补码你先看成是负数1原码的数字—10001(注意这里的最高位是1,是负数)

2、再直接反码注意最高位不用反码了——11110

3、最关键的一步就是补码了切记补码最后一位加1是1就往前面一位数字进1,结果就是——11111

当然这个是笨办法,如果不能理解的话用这个也是可以的我一开始就是这样😂

反码

将你的符号位不变,也就是最高位不变,其次再依次的按位取反,得到反码。

比如 int = - 10;的反码就是—11111111111111111111111111110101

补码

补码就是 反码+1 就能够得到补码,注意是前提是要反码加一💨

还是 比如 int = - 10;的补码就是—11111111111111111111111111110110

这里注意一下是满2进1,不要弄错了~!

如果它是正数的话:原码、补码以及反码都是相同的!

是负数的话就是我上面说的这样!对于整形来说存放的都是补码,切记!

一个字节=8个bit

为什么在计算机中存储的是补码?

在计算机的系统当中,数值都是用补码来表示存储的。原因在于,使用补码,可以将符号位和数值域进行统一的处理;同时,加法和减法当中用补码也可以进行统一的处理(CPU当中只有加法器),此外,尤其是补码与原码的运算过程是可以进行相互转换的!

那么我着重的跟大家说说这个加法器吧,这个加法器其实就是当中CPU运用的加法运算,好接下来我给大家举个例子比如说:1 - 1 那你要转换成加法器怎么办呢?其实很简单只需要:1 + (-1) 就可以了,那么如果你现在要用原码来算呢?

1的原码: 00000000000000000000000000000001

-1的原码: 10000000000000000000000000000001

结果:    10000000000000000000000000000010      所以,1+(-1) = -2吗?答案显然不是的

好!那现在如果我们用补码来算一下呢

1的补码:  0000 0000 0000 0000 0000 0000 0000 0001

-1的补码:  1111 1111 1111 1111 1111 1111 1111 1111 1111

结果:   10000 0000 0000 0000 0000 0000 0000 0000

但是:我们整形当中只能存储的是32位,所以留下的是0,所以用补码进行运算的时候我们是可以算出一个正确的结过的,想到这,我真的觉得当时创作出这个算法的人估计是个神仙吧😯,乘法就是^几次放就加多少,也有可能是转换成某一个运算吧。但是原理都是一样的就是我只要有加法,这些事情我都可以办到。

大端小端介绍:

  1. 大端:存储模式是指内存中的低位保存在内存当中的高地址当中,而数据的高位,保存在内存低地址当中。
  2. 小端:存储模式是指数据中的高位保存在内存当中的低地址当中,而数据的高位,保存在内存高地址当中。
  • 内存空间都是有编号的,我们都把内存的低位叫做低地址,编号大的话那么就是叫做高地址,数据是怎么样存储都是可以的,但是当返回到你的程序当中必须要是怎么样存储回来比如说你整形存储的是 11 22 44 33 (二进制转换十六进制 1个字节=4个bit位),那么你到时候就也是需要这样整形存储出来的 11 22 44 33 !但是我们通常都不会这样去存储内存。通常都是两种存储方法一种叫做大端的存储模式还有一种是小端的存储模式。
  • 假设是:0x11223344,这个44就是低位,而11就是高位,那么这个低位要保存到内存的高地址数,而数据的高位保存在低地址处——大端
  • 再次假设:0x44332211,这个44就是低位,而11就是高地址,低字节的数据保存在内存当中的低地址处,而高字节的数据就保存在高地址处——小端
判断大端小端

用代码实现判断大端小端:

解体思路:一个数字a,存储在内存当中,假设这个a是20的话,在不知情的情况下,不知道当前是大端还是小端的存储。但是,可以推测是不是大端还是小端,就像上面内容所说的那样。我们可以观察它们的第一个字节,就比如说:

  • int a = 1;
  • 小端:0x01 00 00 00
  • 大端:0x00 00 00 01
代码演示
#include<stdio.h>
int main(void)
{
	int a = 1;
	char *p = (char*)&a;
	if (*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

运行结果🖊

小端

自定义函数代码
#include<stdio.h>
int Testing()
{
	int a = 1;
	char * pb = (char*)&a;
	if (*pb == 1)
		return 1;
	else
		return 0;
}
int main(void)
{
	int ret = Testing();
	//返回1代表的是小端,返回0代表的是大端
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

在这里说下指针类型的意义

  1. 指针类型决定了指针解引用访问多少个字节,比如:char *p;那么这里*p只能访问一个字节,根据你自己定义的数据类型💨
  2. 指针类型决定了指针+1,-1的是几个字节,比如:char * p + 1;那么跳过的是一个字节 根据数据类型来判断 int就是4字节
  • 注意:整形提升补的是最高位的符号位,'0’为正,'1’为负 💨
浮点型在内存当中的存储

常见的浮点数:

  • 3.14 、1E10(这个其实就是1.0✖10的10次方—E)

浮点数包括:

  • C语言中的浮点类型有float、double 和 long double 类型。

记数法实例:

  1. 第1列是一般记数法;
  2. 第2列是科学记数法;
  3. 第3列是指数记数法(或称为e记数法);
  • 这是科学记数法在计算机中的写法,e后面的数字代表10的指数;

接下来给大家看一个代码:

#include <stdio.h>
int main(void)
{	
	int n = 9;
	float *pFloat = (float *)&n;
	printf("*pFloat的值为:%d\n",n);
	printf("*pFloat的值为:%lf\n", *pFloat);

	*pFloat = 9.0;
	printf("num的值:%d\n", n);
	printf("*pFloat的值为:%lf\n",*pFloat);

	return 0;
}
  • 运行结果:

  • 从上述代码可以看出:浮点型和整形的内存的存储的形式不一样!
  • 可能会有些小伙伴有些疑问,为什么第二行运行结果的*pFloat的答案是:0.000000,还有第三行的num的运行结果是:1091567616,我觉得因该是 9.000000 和 9啊。好,别着急现在就来说说为什么!
  • 打印:0.000000是因为:整形的形式放进去的时候在以浮点数的形式往后拿的话,拿不到我们期望的一个结果,那是不是可以说明整形的存储结果和浮点型的存储的方式是不一样的,如果一样那就是一样的结果了

  • 打印:1091567616是因为:*pFloat我们是用浮点数的形式存放进去的,然后以n的正数形式在拿的时候是整数的形式拿出来的,拿出来了一个错误的值

  • 从这里就说明了整形的存储方式和浮点型的存储方它们是由区别的💨

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

我们是用浮点数的形式存放进去的,然后以n的正数形式在拿的时候是整数的形式拿出来的,拿出来了一个错误的值

  • 从这里就说明了整形的存储方式和浮点型的存储方它们是由区别的💨

[外链图片转存中…(img-YbwynnMF-1715701070809)]
[外链图片转存中…(img-nAN6wpgL-1715701070810)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值