C语言之整数_数据存储篇(1)

news2024/11/24 11:33:43

目录

数据类型

整形家族

浮点型家族

构造类型

指针类型

空类型

整形在内存中的存储(原反补)

NO1.

NO2. 

NO3. 

NO4. 

NO5. 

NO6.

大端小端字节序

NO.1

NO.2

NO.3 

NO.4

练习题

NO1.

NO2.

NO3.

NO4.

NO5.

NO6.

总结 


数据类型

 在初C语言中,我们已经学习过基本内置类型以及它们所占存储空间的大小。我们再回顾一下。

 每一个类型所占空间的大小都不一样,这么多丰富的类型,那它们存在的意义是什么呢?

类型的意义:

  • 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
  • 如何看待内存空间的视角。

这样我们就会在合适的场景选择合适的数据类型。 

整形家族

char
      unsigned char
      signed char
short
      unsigned short [int]
      signed short [int]
int
      unsigned int
      signed int
long
      unsigned long [int]
      signed long [int]
long long
//关于long long我们酌情使用。
signed     有符号的
unsigned   无符号的

 为什么char字符会归为整形家族?

字符在内存中的存储的是字符的ASCII码值,ASCII码值是整形。

signed和unsigned 修饰的整形有什么区别吗?

 signed是有符号的;unsigned int 是无符号的。

int a;//== sined int a
signed int a;
unsigned int a;

我们平时在编译器上创建一个变量,相当于创建一个有符号的变量。

当然short   long   long long 均是创建变量相当于创建一个有符号signed 的变量。(除了char)

那char呢?

char是否是相当于signed char?C语言标准并没有规定,取决于编译器。

大部分编译器是,不排除小部分编译器是unsigned int

ASCII码表中规定的ASCII码值的范围是0~127(字符均是正数)。

只有小部分负数是可以存储在 signed char

浮点型家族

float
double

long double
//建议酌情使用

构造类型

//自定义类型
> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union

指针类型

int *pi;
char *pc;
float* pf;
void* pv;//无具体类型的指针

空类型

 

void test(void)
//第一个void 表示test函数不会返回任何值
//第二个void 表示test函数没有参数
{
	//
}
int main(void)//
int main(int argc,char* argv[],char* envp[])

整形在内存中的存储(原反补)

 一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

NO1.

那接下来我们来谈谈数据在所开辟内存中到底是如何存储的呢?

计算机能够处理的是二进制的数据。

整型和浮点型数据在内存中也是以二进制的形式进行存储的。

整型在内存中存储的是补码的二进制序列。

NO2. 

 整型的二进制表示形式是怎样的呢?

计算机中的整型有三种二进制表示:原码,反码,补码。

  • 分为有 有符号整数 和 无符号整数。
  • 无符号整数:原码,反码,补码相同。
  • 有符号整数:三种表示方法均有 符号位 和 数值位 两部分。
  • 正数:原码,反码,补码相同。
  • 负数:原码,反码,补码要进行计算的。
  • 符号位:0 表示正
  • 符号位:1 表示负
  • 数值位:正数的原,反,补码相同。
  • 数值位:负数的原,反,补表示方法各不同。

NO3. 

signed int 和 unsigned int? 

 在内存中,对于存储一个整数需要4个字节,也就是32个比特位。

一个整数写出二进制序列的时候,也就是32个比特位。

有符号整数:最高位就是符号位。符号位是1,则表示是负数。符号位是0,则表示是正数

无符号整数:没有符号位,所有位都是数值位。

同一个数无论是有符号整数,还是无符号整数的 数值均相同。

有符号整数的最高位符号位还是会参与运算。

 如下:

#include<stdio.h>
int main()
{
	int a = 10;//== signed int
	//0 0000000 00000000 00000000 00001010
	unsigned int b =10;
    //00000000 00000000 00000000 00001010
	return 0;
}

站在a的角度,第一个0就是符号位。

站在b的角度,第一个0就是数值位。

NO4. 

负整数的原反补怎样转化呢? 

 

NO5. 

进制间的转化?这里我们不专门去讲解,可以自己学一学。

对于整形来说,数据存放内存中其实存放的是补码。为什么呢?

  1. 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号和数值域统一处理。
  2. 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

NO6.

#include<stdio.h>
int main()
{
	int a = -10;//== signed int
	//1 0000000 00000000 00000000 00001010
	//1 1111111 11111111 11111111 11110101
	//1111 1111 1111 1111 1111 1111 1111 0110——补码
	//十六进制
	//0x ff ff ff f6
	unsigned int b =-10;
    //10000000 00000000 00000000 00001010
	return 0;
}

整形在内存中是以二进制的补码存储的,在编译器中为了观瞻,是以十六进制的方式去展示给我们,请问为什么是以十六进制倒叙放置的呢?那接下来我们就要介绍我们的大小端字节序存储。

大端小端字节序

关于内存中二进制/十六进制,单位 比特位和字节的转换,如下图。

NO.1

大端小端产生?

int a=0x11223344
//1 2 3
//百位 十位 各位
//高位      低位

根据字节存储来解释。

我们可以有无数中存储方式,只要按照存进去的方式,在需要使用时拿出来按照原来的顺序放置还原。怎么存都可以!

但是为了简便我们只采用了两种存储方式:

  • 大端字节序存储:把一个数据的低位字节序的数据存放在内存的高地址处,高位字节处的数据存放在内存的低地址处。
  • 小端字节序存储:把一个数据的高位字节序的数据存放在内存的低地址处,高位字节处的数据,存放在内存的高地址处。

除了字符整型,都是这两种存储方式,char1个字节不需要顺序。

NO.2

什么是大端小端?

NO.3 

为什么有大端小端?

NO.4

笔试题:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序?

 

根据上图就有如下代码:

#include<stdio.h>
int main()
{
	int a = 1;//
	char* p = (char*)&a;//强制转化
	if (*p == 0)
		printf("大端\n");
	if(*p == 1)
		printf("小端\n");
	return 0;
}
//用函数包装呢?
#include<stdio.h>
int check_sys(void)
{
	int a = 1;
	char* p =(char*) &a;//强制类型转化
	if (*p == 0)
		return 0;
	if (*p == 1)
		return 1;
}
int main()
{
	int ret = check_sys();
	if (ret == 0)
		printf("大端\n");
	if (ret == 1)
		printf("小端\n");
	return 0;
}

//简化
#include<stdio.h>
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	int ret = check_sys();
	if (ret == 0)
		printf("大端\n");
	if (ret == 1)
		printf("小端\n");
	return 0;
}

练习题

//以下主要讲解的是char类型的signed 和unsigned 
//可以推广到short/long等等
%d 是十进制的形式打印有符号整数
%u 是十进制的形式打印无符号整数

NO1.

请问下面程序a,b,c分别是多少? 

1.
//输出什么?
#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 = -1;
	//有符号的 负数 char类型
	// 10000000 00000000 00000000 00000001原码
	// 11111111 11111111 11111111 11111110反码
	// 11111111 11111111 11111111 11111111补码
	//存储char  11111111补码
	signed char b = -1;
	//有符号的 负数  char类型同上
	//存储char  11111111补码
	unsigned char c = -1;
	//无符号的  负数  char类型
	//无符号——没有符号位的概念
	// 无符号整数一般放置正数,如果放置负数还是按照负数的原反补来计算
	// 10000000 00000000 00000000 00000001原码
	// 01111111 11111111 11111111 11111110反码
	// 01111111 11111111 11111111 11111111补码
	// 存储char 11111111补码
	//存储char  11111111
	printf("a=%d,b=%d,c=%d", a, b, c);
	//%d 是十进制的形式打印有符号整数
	// 即便没有符号,当作有符号去打印
	//整型提升
	// 有符号位提升符号位
	// 无符号位补0,提升0
	// 有符号ab
	//11111111 11111111 11111111 11111111补码
    //10000000 00000000 00000000 00000001原码
	//打印-1
	//b同理-1
	//无符号c
	//1111111
	//00000000 00000000 00000000 11111111补码原码反码
	//正数的原码反码补码相同
	//打印-c
	//225
	return 0;
}

NO2.

 请问下面三端程序分别输出什么?

2.
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
//
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
//
#include <stdio.h>
int main()
{
char a = 384;//128+256
printf("%u\n",a);
return 0;
}
//2.
#include <stdio.h>
int main()
{
	char a = -128;
	//有符号整型 char 负数
	//10000000 00000000 00000000 10000000原码
	//11111111 11111111 11111111 01111111反码
	//11111111 11111111 11111111 10000000补码
	//存储a char        10000000
	printf("%u\n", a);
	//%u 是十进制打印无符号整型
	//整型提升——变量的类型(有符号/无符号)
	//1111111 111111111 11111111 10000000补码
	// 打印——看(u/d)——(u_原反补相同/d_正原反补相同_负的计算)
	//%u把a看成无符号整数
	// 1就不是a的符号位了
	//打印
	//无符号整型原反补相同
	//4,294,967,168
	return 0;
}
//
#include <stdio.h>
int main()
{
	char a = 128;
	//原反补相同
	//00000000 00000000 00000000 10000000补码
	//存储     10000000
	printf("%u\n", a);
	//提升     11111111 11111111 11111111 10000000补码
	//打印——看成无符号的——原反补相同
	//所以还是同上
	return 0;
}

经过我们计算和分析,发现上面三段 代码输出的结果是一样的。why?

  • 有符号的char类型(signed char)取值范围:-128~127
  • 无符号的char类型(unsigned char)取值范围:0~225
  • 截断:超过以上的范围,有一部分数据会被截断,只要存储在内存中的数据必须是在以上范围内。

NO3.

 请问下面这段代码输出什么?

3.
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);

//按照补码的形式进行运算,最后格式化成为有符号整数

#include<stdio.h>
int main()
{
int i = -20;
//10000000 00000000 00000000 00010100
//11111111 11111111 11111111 11101011
//11111111 11111111 11111111 11101100补码
unsigned int j = 10;
//00000000 00000000 00000000 00001010原反补相同
printf("%d\n", i + j);
//11111111 11111111 11111111 11110110补码
//10000000 00000000 00000000 00001010原码
//-10
return 0;
}

NO4.

下面这段代码输出什么? unsigned int的范围

4.
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}

NO5.

 下面这段代码输出什么?signed char的范围

5.
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}

NO6.

 下面这段代码输出什么?unsigned char的范围

6.
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}

总结 

有符号整型signed char 

 

 无符号整型unsigned int

  •  有符号整型signed char的取值范围:127 ~  -128
  • 无符号整型unsigned char的取值范围:0~255

同理我们可以将以上代码应用于其他整型short/int/long等等。总结出它们的取值范围。特别注意千万别掉进无符号整型的陷阱了!!🆗🆗🆗

例如:short两个字节 16个比特位

  • 有符号整型signed short的取值范围:-32768~32767
  • 无符号整型unsigned short的取值范围:0~65635

同理大家自己动手总结一下整型类型的取值范围。

关于浮点数的存储会在下篇博文讲解,同时也会去总结二进制中的知识和易错混点。

✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正。

代码-----------------→【gitee:https://gitee.com/TSQXG】

联系-----------------→【邮箱:2784139418@qq.com】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 之 变量修饰符public 与private 以及默认

文章目录 publicprivate默认情况的成员变量 public 当在Unity中使用public修饰符时&#xff0c;它将变量声明为公共变量&#xff0c;这意味着该变量可以在Unity编辑器中进行设置&#xff0c;并且可以从其他脚本中访问和修改。公共变量在Unity中广泛用于在脚本之间共享数据&…

4.Linux下Cmake交叉编译Qt项目到Jetson Orin Nano(arm)

由于3&#xff1a;Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano&#xff08;ARM&#xff09;_月上林梢的博客-CSDN博客 这一篇文章只用手动配置&#xff0c;一直在点、点、点。比较 LOW&#xff0c;现在在Ubuntu上使用Cmake实现交叉编译QT程序到Jetson Orin Nano…

电脑技巧:电脑关机、休眠、睡眠之间如何选择,看完你就懂了

目录 一、关机、休眠、睡眠的区别&#xff1f; 1.关机 2.休眠 休眠的优点 休眠的缺点 3.睡眠 睡眠的优点 睡眠的缺点 二、什么时候关机/休眠/睡眠&#xff1f; 什么时候需要关机&#xff1f; 什么情况下使用休眠模式&#xff1f; 什么情况下使用睡眠模式&…

Linux之维护基本存储空间

目录 维护基本存储空间 1.查看磁盘信息&#xff08;块设备&#xff09;信息 2.创建分区 (1)MBR分区 标准MBR结构如下 为什么MBR最多只能有4个主分区 (2)GPT分区 优点 3.分区工具 1.使用fdisk管理MBR分区 语法格式 参数及作用 2.使用gdisk管理GPT分区 操作步骤 3.使用pa…

Java项目之基于ssm框架的社区生活超市管理系统(附源码)

基于ssm框架的社区生活超市管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于ssm框架的社区生活超市管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更…

右值及右值引用

右值引用主要是为了优化。 在函数返回值没有打开-fno-elide-constructors时&#xff0c;函数返回值会调用拷贝构造函数 class X { public:X(){cout << "X ctor" << endl;}X(const X& x){cout << "X copy ctor" << endl;}~X()…

【数据库】表字段设计时不推荐使用可空值(NULL)

【Mysql】数据库系列 文章目录 前言一、表和数据准备二、验证1.NOT IN子查询在有NULL值的情况下返回永远为空结果2.使用&#xff01;去查询可空值字段时&#xff0c;数据中存在NULL&#xff0c;NULL记录查询不到3.如果在两个字段进行拼接&#xff1a;比如前缀名字&#xff0c;字…

Azure虚拟网络对等互连

什么是Azure虚拟网络对等互联 Azure虚拟网络对等互联&#xff08;Azure Virtual Network peering&#xff09;是一种连接两个虚拟网络的方法&#xff0c;使得这两个虚拟网络能够在同一地理区域内进行通信。它通过私有IP地址在虚拟网络之间建立网络连接&#xff0c;不论是在同一…

Java 项目日志实例:LogBack

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ LogBack 和 Log4j 都是开源日记工具库&#xff0c;LogBack 是 Log4j 的改良版本&#xff0c;比 Log4j 拥有更多的特性&#xff0c;同时也带来很大性能提升。LogBack 官方建…

华为OD机试 - 全量和已占用字符集 - 数据结构map(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

基于51单片机直流电机PWM调速液晶1602显示设计

一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统&#xff0c;并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节&#xff0c;从而控制其输入信号波形等…

Endnote在线链接pubmed的时候报错12057:不能连接到吊销服务器,或者未能获得最终响应?

​嘎嘎嘎问题如下&#xff1a; 解决办法&#xff1a; 打开控制面板: ok,完了之后再去EndNote就不会出现此问题了。&#xff08;有的可能需要重启电脑&#xff0c;重启EndNote才会生效&#xff09;

基于MOEA/D求解电力系统中环境经济调度问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

三维重建_基于图像的三维重建_面片/光度一致性

参考: 深蓝学院 基于图像的三维重建 1. 三维重建的流程回顾 基于深度图的三维重建:从无序图像获取稀疏点云和位姿,然后进行多视角立体重建。 多视角立体重建包含:(输入稀疏点云、各个图像位姿、图像)先进行立体对(3D-2D,2D-2D)的选择,然后计算深度图,接着进行深度图…

如何绕过计算机任何限制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、创建记事本总结 前言 如果您在学校的电脑或笔记本就会发现它会限制您的天马行空的想法&#xff0c;因为它会限制command&#xff0c;powershell&#xff0…

java八股文面试[JVM]——JVM内存结构

参考&#xff1a; JVM学习笔记&#xff08;一&#xff09;_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互 JVM内存结构&#xff1a; 方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实…

【C语言】C语言用数组算平均数,并输出大于平均数的数

题目 让用户输入一系列的正整数&#xff0c;最后输入“-1”表示输入结束&#xff0c;然后程序计算出这些数的平均数&#xff0c;最后输出输入数字的个数和平均数以及大于平均数的数 代码 #include<stdio.h> int main() {int x;double sum 0;int cnt 0;int number[100…

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)1- 移动Type间振替转记

SAP 中在库移动 不仅有入库&#xff08;GR&#xff09;&#xff0c;出库&#xff08;GI&#xff09;&#xff0c;也可以是单纯内部的转记或转送。 1&#xff0c;振替转记&#xff08;转移过账&#xff09; 2&#xff0c;在库转送&#xff08;库存转储&#xff09; 1&#xff…

Ae 效果:CC Scale Wipe、CC Radial ScaleWipe

过渡/CC Scale Wipe Transition/CC Scale Wipe CC Scale Wipe&#xff08;CC 缩放擦除&#xff09;主要通过缩放拉伸来擦除图层内容&#xff0c;从而实现一种独特的过渡效果。 CC Scale Wipe 效果示例 ◆ ◆ ◆ CC Scale Wipe 效果属性说明 Stretch 拉伸 控制对图层内容拉伸的…

中国剩余定理及扩展

目录 中国剩余定理解释 中国剩余定理扩展——求解模数不互质情况下的线性方程组&#xff1a; 代码实现&#xff1a; 互质&#xff1a; 非互质&#xff1a; 中国剩余定理解释 在《孙子算经》中有这样一个问题&#xff1a;“今有物不知其数&#xff0c;三三数之剩二&#x…