百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

【新书推荐】2.5节 有符号整数和无符号整数

liuian 2025-03-12 16:47 31 浏览

本节内容:整数的编码规则。

数据的编码规则:计算机的二进制数对于计算机本身而言仅仅表示0和1。人们按照不同的编码规则赋予二进制数不同的含义。整数的编码规则分为有符号整数和无符号整数。

数据的存储规则:x86计算机以字节为单位,按照高高低低的原则存储数据,即高地址存储数据的高位值,低地址存储数据的低位值,称之为小端存储规则。反之则称为大端存储规则。

无符号数的编码规则:无符号整数全部是正数,所有数据位都表示数值,没有符号位。

有符号数的编码规则:最高位为符号位,“0”表示正数,“1”表示负数。

2.5.1 数据的编码规则

在前面的章节中,我们知道了在电子计算机内存储的都是二进制数0和1。计算机只是一台机器,并不能识别各种不同类型编码格式的数据。数据的编码格式是我们人为定义的。

举例

下面的数据表示什么意思?

文本文件中这个数据可能表示逗号,exe程序中也可能是一条指令,也有可能是一个数字55H。不同的文件有不同的编码规则,对应不同的含义。比如视频、图片、文本等等。

2.5.2 数据的存储规则

有了指定的数据编码规则之后,我们还需要考虑以什么样的方式将数据存储到计算机的内存中。在x86计算机中,数据是以小端方式存储的,低地址存储数据的低字节,高地址存储数据的高字节,即高高低低的存储方式。而在网络传输中,数据则以大端方式存储的,与小端存储方式相反,低地址存储数据的高字节,高地址存储数据的低字节。下面我们来做实验,验证x86计算机中的小端存储方式。

动手实验5:x86计算机中的小端存储方式

mov eax,0x12345678这条指令的含义是将一个32位的16进制数存入eax寄存器。我们做一个实验,将这条指令写入DTdebug调试器,在调试器中观察如何存储0x12345678。

第一步:打开DTdebug调试器,将IPMSG200.exe拖入调试器中。

第二步:左上角反汇编窗口双击第一条汇编指令,弹出的对话框中填写mov eax,0x12345678指令,点击汇编选项或者直接回车。如图2-14所示,左侧硬编码中的数据为78-56-34-12,与我们正常书写的顺序相反。

图2-14 反汇编窗口观察小端存储模式

第三步:接下来,鼠标点入左下角内存窗口,键盘输入CTRL+G,弹出对话框窗口中输入该条指令的起始地址775a1c37,如图2-15所示:

图2-15 跳转到内存地址

第四步:观察内存窗口,如图2-16所示:在低地址775a1c37处存储低字节数据78,以此类推,地址775a1c38处存储56,地址775a1c39处存储34,高地址775a1c3a处存储高字节数据12,与图2-14所示的硬编码中的小端存储方式相同。

图2-16 内存窗口观察小端存储模式

2.5.3 无符号数的编码规则

无符号整数编码规则:无符号整数全部都是正数,是什么就存什么,没有符号位。

举例

无符号整数9AH,数据宽度为32位。

十六进制数表示:0x0000009AH。

二进制数表示:0000 0000 0000 0000 0000 0000 1001 1010B。

注意:当我们表述或定义一个整数时,一定要表明数据的宽度。

2.5.4 有符号数的编码规则

有符号整数编码规则:最高位为符号位,“0”表示正数,“1”表示负数。

举例

有符号整数1AH,数据宽度为32位

正数:符号位为0。

十六进制数表示:0x0000001A。

二进制数表示:00000000 00000000 00000000 0001 1010。

负数:符号位为1。

十六进制数表示:0x8000001A。

二进制数表示:10000000 00000000 00000000 0001 1010。

图2-17 无符号整数和有符号整数

如图2-17所示,无符号整数常见的三种数据类型为字、双字和四字。所有数据位均表示整数数值,并且都是正整数。有符号整数常见的三种数据类型为字、双字和四字。最高位表示符号位,最高位为0,表示有符号正整数,最高位为1,表示有符号负整数,其余各位表示整数值。

以圆的形式表现数据的存储范围

字节(Byte) :0~0xF 4位

图2-18 4位整数的存储范围

如图2-18所示,4位无符号整数的数据范围:0 1 2 3 4 ......F (10进制0 ~15)。

4位有符号整数的数据范围:(-8 ~ 7)。

正数:0,1,2,3,4,5,6,7 (10进制0 ~7)。

负数:F,E,D,C,B,A,9,8 。

F= -1( 10进制-1~ - 8 )。

字节(Byte) :0~0xFF 8位

图2-19 8位整数的存储范围

如图2-19所示,8位无符号整数数据范围:0 1 2 3 4 ......FF(10进制0~255)。

8位有符号整数数据范围:(-128~127)。

正数:0......3F,40......7F (10进制0 ~127)。

负数:FF......C0,BF......8 0。

FF= -1( 10进制-1~ - 128 )。

字(Word) :0~0xFFFF 16位

图2-20 16位整数的存储范围

如图2-20所示,16位无符号整数数据范围:0 1 2 3 ......FFFF(10进制0~216-1)。

16位有符号整数数据范围:(-215~215 -1)。

正数:0....3FFF,4000...7FFF (10进制0 ~215 -1)。

负数:FFFF......C000,BFFF......8000

FFFF= -1( 10进制-1~ - 215 )

双字(Dword) :0~0xFFFFFFFF 32位

图2-21 32位整数的存储范围

如图2-21所示,32位无符号整数数据范围:0 1 2 3 …FFFFFFFF(10进制0~232-1)。

32位有符号整数数据范围:(-231~231 -1)。

正数:0...3FFFFFFF,40000000...7FFFFFFF(10进制0 ~231 -1)。

负数:FFFFFFFF...C0000000,BFFFFFFF...80000000。

FFFFFFFF= -1( 10进制-1~ - 231 )。

2.5.5 无符号和有符号整数数据类型的定义

在8086 16位汇编语言中,程序员根据无符号整数和有符号整数的指令来确定指令操作数为有符号整数还是无符号整数。无符号指令有JB、JA、SHR等,有符号指令有JL、JG、SAR等。80386以上32位或64位汇编语言,C\C++等高级语言中,程序员在数据定义时明确整数的编码格式为有符号整数还是无符号整数。如32位汇编语言无符号整数数据类型Byte、Word、Dword等,有符号整数数据类型SByte、SWord、SDword等。

举例

16位汇编语句

var1 db 1 ;数据类型db,并未说明变量var1是有符号数还是无符号数

cmp al,var1 ;比较无符号整数大小

JB next1 ;JB无符号数指令,当无符号数al小于无符号数var1时,跳转到next1地址

Next1:

var1 db 1 ;数据类型定义db,并未说明变量var1是有符号数还是无符号数

Cmp al, var1 ;比较有符号整数大小

JL next2 ;JL有符号数指令,当有符号数al小于有符号数var1时,跳转到next2地址

Next2:

32位汇编语句

var2 byte 1 ;数据类型byte,说明变量var2是无符号数

cmp al,var2 ;比较无符号整数大小

JB next1 ;只能使用无符号数指令JB

Next1:

var2 sbyte 1 ;数据类型sbyte,说明变量var2是有符号数

cmp al,var2 ;比较无符号整数大小

JL next1 ;只能使用有符号数指令JL

Next1:

C语言

usigned char var3; //无符号整数,数据宽度8位

usigned char var4;

signed char var5; //有符号整数,数据宽度8位

signed char var6;

If (var3 < var4) //比较无符号整数var3,var4大小

If(var5 > var6) //比较有符号整数var5,var6大小

else

注意

汇编语言中并不会严格检查有符号或无符号数据类型,只要数据类型的宽度一致,编译器并不会报错。即上述示例中无论使用JB指令还是JL指令,数据宽度都是8位。编译都可以通过,具体定义为哪种数据类型,由写这条语句的程序员来决定。

但是在C/C++等高级语言中,编译器会严格检查数据类型,如果数据类型错误,通常编译无法通过。

我们将在后续的课程中学习汇编16位汇编语言、32位汇编语言和C语言的语法规则。

总结

1.无符号整数和有符号整数是计算机整数编码规则。

2.无符号数都是正整数,没有符号位,所有数据位均表示整数值。

3.有符号整数最高位为符号位,分为正整数(最高位为0)和负整数(最高位为1)。

4.如果存储的数据超过最大宽度,那么多余的数据将被丢弃!

5.无符号整数和有符号整数的数据类型表示数据宽度,由程序员定义,与计算机无关。

6.x86 CPU只进行整数的算术逻辑运算。浮点数(数学中的实数)由x87处理器处理。我们将在第四十一章浮点处理器及其指令编码中详细讲述。

本文摘自编程达人系列教材《X86汇编语言程序设计》16位汇编。

相关推荐

戴尔声卡驱动器官方下载(戴尔5502声卡驱动)

戴尔电脑声卡驱动是SoundCardDriver。声卡驱动就是指电脑多媒体声卡控制程序,英文名为"SoundCardDriver",是一种可以让电脑和声卡设备通信的特殊程序驱动...

电脑开不了机怎么做系统(电脑开不了机怎么样装系统)

1、在可用电脑上制作好U盘启动盘,将下载的电脑系统iso文件直接复制到U盘的GHO目录下;2、在开不了机的电脑上插入U盘,重启后不停按F12或F11或Esc等快捷键打开启动菜单,选择U盘选项回车,比如...

u盘文件夹里面的文件不见了(u盘里的文件夹突然不见了怎么办)

可能出现以下几种情况:1.文件夹被隐藏了:在文件夹上右击->属性->勾选“隐藏”选项。2.文件被删除了:需要查看最近删除的文件。3.文件夹被移动了:通过搜索查找文件夹。4....

联想z6pro(联想官方售后服务中心官网)

  联想Z6Pro5G版正面采用了时下流行的水滴屏设计,6.39英寸三星AMOLED材质,而对于担心频闪问题的消费者有一个好消息——联想Z6Pro5G版的屏幕全程采用了DC调光。笔者并未在设置...

ie浏览器更新在哪里(ie浏览器在哪里更新版本)
ie浏览器更新在哪里(ie浏览器在哪里更新版本)

1.打开桌面的IE浏览器2.点击菜单栏的的帮助3.打开关于InternetExplorer(A)4.自动安装新版本前面打勾即可。ie浏览器更新是很简单的,具体操作步骤如下:1、打开浏览器首先我们打开电脑桌面,然后在电脑上找到“浏览器”图标...

2025-12-15 05:05 liuian

server2019开机黑屏只有cmd(server2019开机黑屏只有cmd怎么重装)

explorer是启动Windows窗口的执行文件,如果这个文件不执行,就不能打开Windows的窗口界面。可能是安装程序有问题,这个文件不存在。重新找一个安装文件,重新安装试一下。你先输入explo...

共享文件怎么弄(共享文件怎么弄出来)

为了安全地共享文件,具体的步骤如下:1)将文件复制到共享文件夹;2)设置文件权限,此处可以设置允许或拒绝他人读取、写入和修改文件;3)选择共享文件夹中的文件,用鼠标右键点击并选择“共享”;4)设置“共...

电脑摄像头怎么连接手机(电脑摄像头连接手机软件)

电脑手机方法/步骤1/4分步阅读首先打开电脑,然后将手机插入USB接口连接起来。在连接成功以后,在电脑上会自动进行驱动的安装。2/4之后手机上就会出现提示,我们在菜单中点击一下第二个“相机(PTP...

格式化命令和参数(格式化命令在哪个菜单中)

1,你用DM万用版或LFORMAT命令可实现硬盘的低格。2,用DOS的DEBUG命令也可实现低格操作如下:A:\>DEBUG-A100-,0703;交叉因子为3-,000...

电脑浏览器缓存怎么清理(电脑浏览器清理缓存怎么操作)

把浏览器直接删除。然后重新下载安装。一个浏览器在使用一段时间之后,往往会产生大量的缓存,严重影响电脑的运行,并且占有电脑大量的资源,那么很多清理缓存的方法它都是不彻底的,所以你不如直接把浏览器在电脑当...

笔记本电脑开机黑屏只显示鼠标

问题分析:电脑开机显示器不亮分两种情况:显示器未通电(电源指示灯不亮)或通电(电源指示灯亮)但无信号或屏幕显示“nosighal”,前者表示电路不通,或者是电源接口或电源线接触不良或损坏,后者一般是...

小米笔记本系统下载(小米系统官方网入口)
  • 小米笔记本系统下载(小米系统官方网入口)
  • 小米笔记本系统下载(小米系统官方网入口)
  • 小米笔记本系统下载(小米系统官方网入口)
  • 小米笔记本系统下载(小米系统官方网入口)
路由器详细设置教程(路由器设置方法及步骤)

步骤/方式一以TP-LINK无线路由器为例,将宽带网线接到路由器的LAN口。步骤/方式二用网线连接电脑和路由器。步骤/方式三打开浏览器,登录路由器管理界面。步骤/方式四点击设置向导。步骤/方式五选择让...

linux系统下载到手机(linux安装到手机)

1、首先在手机设置中点击【安全】选项。2、然后在安全页面点击【支付保护】,关闭支付应用后面的开关即可。手机盾是以手机TEE(可信执行环境)和SE(安全元件)为载体实现的二代USBKEY,完全不依赖任何...

tplink密码在哪看(如何查看tplink路由器密码)

输入192.168.1.1或者是192.168.0.1账号密码都是admin进去找到网络获取方式,拨号就可以看到账号了至于密码除非你那有选择显示密码,你才能看到,否则都是点点其实装网的时候...