原码,反码,补码(必备知识)

目录

1:原码,反码,补码的计算方法

2:几道整数在内存中存储的列题

3:如何判断机器的字节序即(大端与小端)



1:原码,反码,补码

1:首先我们要知道的是原码,反码,补码是对于整数在计算机中3种形式,

       对于正数来说 : 原码=反码=补码,而负数我们需要计算

        原码:直接用二进制表示该数字,就称为该数的原码,负数我们先把他的正数的二进制形式表示出来,然后最高位改为1.

        比如说:

int a =10;
//10的二进制: 00000000000000000000000000001010
int b =-10;
//-10的二进制:-10000000000000000000000000001010

这里我们需要知道,最高位表示该数的符号位,如果最高位为1则该数为负值,最高位为0该数为正数。

     反码:符号位不变,其它位按位取反。

     补码:反码加1得到的就是补码。  这两个运算规则只针对于负数来说的。下面我们举例子:

        

int a =-10;
//原码:10000000000000000000000000001010
//反码:11111111111111111111111111110101   符号位,不变其它位按位取反
//补码:11111111111111111111111111110010    反码加1

   对于我们计算机而言,整形的存储是以补码的形式存在与内存当中,所以我们在使用数据运算的时候,计算机先将他转化为补码,然后在进行运算的。

我们也可以通过一个列子来说明计算机是使用补码进行相互运算的:>

int a =10;
int b =-5;
//a的补码:00000000000000000000000000001010

//b的原码:10000000000000000000000000000101
//b的反码:11111111111111111111111111111010
//b的补码:11111111111111111111111111111011

//b的补码:11111111111111111111111111111011
//a的补码:00000000000000000000000000001010
//b的原码:10000000000000000000000000000101
//a+b原码:10000000000000000000000000001111  很明显这个结果为-15
//a+b补码: 00000000000000000000000000000101//因为整形只有32个比特位,所以最高位1被阶段了
//所以结果位 5 

        到这里原,反,补码已经讲解完了。

2:列题讲解

        

        (1)

int main()
{
  unsigned char a = 200;
  unsigned char b = 100;
  unsigned char c = 0;
  c = a + b;
  printf(“%d %d”, a+b,c);
  return 0;
}
这里我们应该怎么算呢?
    首先我们将 200与100的补码表示出来
    //200的补码00000000000000000000000011001000
    //100的补码00000000000000000000000001100100
    //a+b的补码00000000000000000000000100101100//  值:300
    //a的原码:11001000
    //b的原码:01100100
    
    //因为在进行计算,且为char的变量,而我们计算机内存最小只能处理四个字节的计算,所以他们会发生整形提升。
//a提升后:11111111111111111111111111001000
//b提升后:00000000000000000000000001100100
//a+b:  100000000000000000000000000101100
//c的补码:00101100,所有c的值为44
/

原码,反码,补码(必备知识)_第1张图片

(2)

         

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

 原码,反码,补码(必备知识)_第2张图片

 在这里我们还需要知道我们char的范围为-128~127.

在这里我们就结束了题目的分享,如果你能理解,那我相信原,反,补码,整形提升,计算机内部的底层运算,我相信你应该掌握透彻了

3字节序的存储(大端,小端)

 在我们内存中我们需要对单位字节的内容进行存储的顺序,就叫字节序

     在我们的计算机中有两种储存方式1种是大端存储模式,另一种是小端存储模式,下面我们来介绍两种存储方式的概念。

        一般内存中存储是以16进制数据表示,而4个2进制位就是一个16进制位

        小端存储模式:数据的低位字节的内容存储在低地址处,高字节位的内容存储在高地址处。

        大端存储模式:数据的低位字节的内容存储在高地址处,高字节位的内容存储在低地址处。

        低位:数据最右边的内容,比如说

原码,反码,补码(必备知识)_第3张图片

 我们可以通过一段代码来判断我们机器是大端,还是小端:

        

int main()
{
    //这里的a可以自己写值,但是要好判断
	int a = 1;
	//a的16进制位表示方法00000001
	//我们可以通过指针来访问a的一个字节,如果*p==1,即低字节位存放在低地址,即小段
	char* p = (char*)&a;//强制类型转换,只访问1个字节的内容
	if (*p == 1)
		printf("小端\n");
	else
		printf("大端\n");

	return 0;
}

我们也可以通过vs来看内存的分布情况:

原码,反码,补码(必备知识)_第4张图片

 

    本文章分享完毕!感谢大家的观看,如果有收获,记得点个赞哦!

你可能感兴趣的:(c语言,windows,深度学习)