整形在内存中的存储

一、数据类型

1.1、整形家族

char
   unsigned char
   signed char
short
    unsigned short
    signed short
int 
    unsigned int 
    signed int 
long
    unsigned long
    signed long

注:这里的unsigned int(无符号整形) 和signed int(有符号整形)唯一区别便是二进制位最高位代表什么意思。如、unsigned int便代表二进制位为数值位,有一定的数值大小。signed int最高二进制位为符号位。1代表负数,零代表整数。

1.2、浮点数家族

     float
     double

1.3、构造类型

     数组类型
     结构体类型struct
     枚举类型enum
     联合类型union

1.4、指针类型

     char* pc
     short* ps
     int* pi
     float* pf
     void*

1.5、空类型

     void 表示空类型
     常用来表示函数的返回类型,函数的参数,指针类型

二、整形在内存中如何存储

2.1、原码,反码,补码

整数在内存中有三种表现形式,原码,反码,补码

正数的原码,反码,补码相等
负数的原码,反码,补码转换如下图所示

符号位不变其他位取反
反码加1
原码
反码
补码

除了这些,我们还要知道,我们在敲代码的时候,什么时候用的原码,什么时候用的补码。**至于反码,不过是原码到补码转换过程中的一个中间状态,具体没有太大含义。**下面我们用vs2019在编译器中寻找答案。注意,由于为了增加数据在内存中的可读性,数据的二进制位在内存中是用十六进制存放的。遗忘的同志,可以适当的复习一下

在这里插入图片描述
在这里我们不能的出什么结论,毕竟正数的原码,反码,补码相同。那我们继续往下看
在这里插入图片描述
如果看b=-5这个例子,结果就显而易见了。即,数据在内存中存放的是二进制补码。下面我们看一下打印结果。
在这里插入图片描述

结论:
这下我们就全部全部搞懂了,数据在内存中存放的是补码,而打印的是原码。

2.2、整形家族在内存中表示的范围,这里我们以char为例,其他情况类似

char类型分为signed charunsigned char。
无符号的char由于最高的二进制位表示位数值位。故,数据的范围为00000000到11111111转化为十进制为0到255
有符号的char我们用画图来解释。

在这里插入图片描述
结论:
有符号的char在内存大小的范围是-128~127。
short int类型范围类似,可以自行推导

三、大小端字节序

3.1、大小端的概念

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地中。

四、习题练习

4.1、大小端判断

#include <stdio.h>
int check_size()
{
	int a = 1;
	//a的补码00000000000000000000000000000001
	//00000001大端  或者01000000小端
	//因此我们只需要查看数据在内存中存放的第一个字节的大小,
	//值为1小端,为0大端
	char* p = (char*)&a;
	if (*p == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	if (1 == check_size())
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

4.2、整形在内存中的存储中习题

//那么下段代码输出的结果是什么呢?
//%u 打印无符号整形
#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}
-128的原码
10000000000000000000000010000000
11111111111111111111111101111111    反码
11111111111111111111111110000000    补码
10000000  截断
11111111111111111111111110000000    整形提升 补码
因为%u以无符号数打印,故原码,反码,补码相等,为
11111111111111111111111110000000是一个很大的正整数。
当然,你也可以在计算器里算一下。

在这里插入图片描述

当然,后面也有几道类似习题,大家感兴趣也可以做一下,答案的话自己可以在编译器里跑一下就全部解决了。

例一:
#include <stdio.h>
int main()
{
  char a= -1;
  signed char b=-1;
  unsigned char c=-1;
  printf("a=%d,b=%d,c=%d",a,b,c);
  return 0;
}
例二:
#include <stdio.h>
int main()
{
  char a = 128;
  printf("%u\n",a);
  return 0;
}
例三:
int i= -20;
unsigned  int  j = 10;
printf("%d\n", i+j);
  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sense the warmth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值