计算机中整数的表示和运算

作者&投稿:侨股 (若有异议请与网页底部的电邮联系)
~

整数主要有两种编码方式。一种只能用来表示非负数,另一种能够表示负数、零和正数,对应着 C 语言中的无符号数和有符号数。而 Java 只支持有符号数。

无符号编码基于常规的二进制表示法。将一个 ω 位的位向量 看作二进制数,就得到了 的无符号表示。此处使用符号 表示将 ω 位的位向量根据无符号编码映射到非负整数,有:

例如:

根据以上公式可知 ω 位无符号编码的值范围为 。

很多情况下我们需要使用负数值,最常见的有符号数的计算机表示方式就是 补码(two's complement) 形式。补码编码中,将最高位解释为负权值。此处使用符号 表示将 ω 位的位向量 根据补码编码映射到整数,有:

例如:

ω 位补码的值范围为 。

C 语言中允许在不同的数字数据类型之间做强制类型转换,包括有符号数和无符号数之间。虽然 C 标准没有指定有符号数要使用某种表示,也没有精确规定有符号数和无符号数之间如何进行转换,但几乎所有机器都使用补码,同时大多数系统遵循的同等字长有符号数和无符号数之间的转换规则是:

我们使用一个例子进行说明:

C 语言中有符号数和无符号数之间的转换规则加上它的算术转换的性质可能会导致一些奇特的行为。如果一个表达式中既有无符号数也有有符号数,那么有符号数会被隐式转换为无符号数,这种行为对算术运算影响可能并不大,但对于 >、< 这些关系运算符来说,会导致一些非直观的结果,看一些例子:

上一个小节的例子中,我们使用 -2147483647 - 1 来表示 32 位补码能表示的最小值,再看一下 C 标准库头文件 limit.h 文件中定义的 和 :

这和 C 语言中对整型常量的实际类型的认定是有关的。整型常量的实际类型取决于长度、基数、后缀字母和 C 语言实现的确定的类型的表示精度。具体的规则如下表所示:

常量的数据类型是从上面表格里选择第一个最合适(能表示常量而不溢出的)的类型。另外,C 标准中规定整型常量以数字开头,前面可以包含指定基数的前缀。也就是说如果不发生溢出,整型常量的值总是非负数。如果前面出现负号,则是对整型常量使用的一元运算符,而不是整型常量的一部分。

2147483648 超出了 int 和 long 类型所能容纳的最大值,所以用 unsigned long 类型来容纳,前面的负号作为运算符对这个无符号数求反,结果依然是 unsigned long 类型。而 0xFFFFFFFF 则会使用 unsigned 类型容纳,求反后依然是 unsigned 类型。这也就是为什么 C 语言中定义 Tmin 不用 不用 -2147483648 或 0xFFFFFFFF 来表示的原因。

当不同字长的数据类型之间进行转换时,就会涉及到数字的扩展和截断,只需要遵守以下规则:

本篇文章主要主要是对整数在计算机中的存在形式以及一些类型转换和运算中的行为方式进行了总结,了解这些也是为了在写程序过程中做到有的放矢,避免一些由于数据类型导致的 bug 或者能够从位级行为上理解这些 bug 是如何产生的从而进行修复。之后我还会对浮点数、字符、字符串进行类似的总结,彻底理清楚计算机中信息的编码表示。

当然,本文没有涉及到整数加减乘除等运算的数学原理和位级行为,总体来说,计算机执行的整数运算是一种模运算形式。表示数字的有限字长限制了数据可能的值的取值范围,结果可能溢出。另外整数运算中,无论运算数是以无符号数还是补码形式表示的,都有完全一样或非常类似的位级行为。想要了解更多细节和原理,可以查阅《深入理解计算机系统》第三章节的内容。




c语言计算整数各位数字之和
c语言计算整数各位数字之和为ubuntu 14.04 linux cgcc(Ubuntu 4.8.2-19ubuntu1)4.8.2。1、简介:C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支...

python整数可以有多少位(python求整数的位数及各位数字之和)
关于Python支持的最大整数是多少32位系统上是2**31-1,64位系统上是2**63-1 不过,超过这个范围后python会自动转用高精度计算,这样用户看起来就好像支持更大的整数计算。、机内整数的表示范围和什么有关?Python中能表示的最大整数是十进制多少位的机内整数的表示范围跟这种类型,的存储占用几个字节...

python整数多少位(python各位数字之和)
本文目录一览:1、python整数类型在每一台计算机上的取值范围是一样的吗?2、使用Python判断输入的整数位数并求出每个位上的值3、python中数据类型包括4、关于Python支持的最大整数是多少5、、机内整数的表示范围和什么有关?Python中能表示的最大整数是十进制多少位的6、python3的int类型是几位的?pyt...

计算机代码1—10这10个数字表示什么意思 例如:数字1 计算机代码00001 这...
所以,原码、反码、补码本质上是用来解决负数在机器中表示的三种不同的编码方法。(3) 二进制位数相同的原码、反码、补码所能表示的数值范围不完全相同。以8位为例,它们表示的真值范围分别为: 原码: -127~+127反码: -127~+127补码: -128~+127(4) 上面讨论的原码、反码、补码都是针对真值X为整数而言的。若...

什么是机器数?
机器数是计算机用来表示数字的二进制数,也被称为计算机数或数码。在计算机中,所有数据都是以二进制形式存储和处理的。通常,机器数可以分为整数和浮点数两种类型。整数机器数采用定点表示法,也就是采用固定的位数来表示整数,例如8位整数可以表示-2^7~2^7-1的范围,16位整数可以表示-2^15~2^15-1的范围,以此类...

二进制原码、反码、补码运算及标志位
在8位二进制中,如果一个运算的结果最终超过 [-128,127] 无论是大于127还是小于-128就被认为是溢出,OF被置为1,如果结果在 [-128,127] 就认为没溢出OF被置为0。SF(Sign Flag) :符号标志。用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以...

8位带符号定点整数是原码所表的真值范是什么
数在计算机中是以二进制形式表示的.数分为有符号数和无符号数.原码、反码、补码都是有符号定点数的表示方法.一个有符号定点数的最高位为符号位,0是正,1是副.以下都以8位整数为例,原码就是这个数本身的二进制形式.例如 0000001 就是+1 1000001 就是-1 正数的反码和补码都是和原码相同.负数的...

python求整数多少位?
计算各个数位上的数字之和 he=m1+m2+n2 输出和 print("输入的三位整数为:",shuzi)print("百位数为:",m1)print("十位数为:",m2)print("个位数为:",m3)print("各位数字之和为:",he)、机内整数的表示范围和什么有关?Python中能表示的最大整数是十进制多少位的机内整数的表示范围跟这种...

在定点机中执行算术运算时会产生溢出 ,原因?
运算结果的操作数超出了机器的表示范围。可能早期的定点机使用定点数进行运算,后来发现定点数表示范围有限,不得不使用浮点数,可是定点机又没有处理浮点数的能力,只好在编译器上或代码上下功夫,所以才会导致使用比例因子等,这样就增加了可执行文件的尺寸或代码的处理机制。

int和float的区别是什么?
int和float是两种不同的数据类型,常用于编程语言中表示数值。 int用于表示整数,没有小数部分,精确度较高。 float用于表示带有小数部分的数值,具有更大的范围,但具有舍入误差。 具体表现为一下区别: 1.区别于整数和浮点数: "int" 是整数类型,用于表示没有小数部分的整数值。例如:-3、0、5等。 "float" 是浮点...

龙海市19559429760: 计算机中如何表示正负数?如何表示整数和实数? -
闽刮鼻炎:[答案] 这个问题并不复杂,表示一个带符号的整数常用的方法有三种:原码、反码表示法和补码表示法.先来看看原码表示法.在计算机中,数的符号是用一个数位来表示的,一般用数的最高位.正号用0表示,负号用1表示.所谓原码,就是简单地遵循这一规定...

龙海市19559429760: 计算机基础判断题整数在计算机中的表示常用最高位作为其符号位,用"1"表示"+"(正数),"0"表示" - "(负数),其余各位则用来表示数值的大小... -
闽刮鼻炎:[答案] 整数在计算机中的表示常用最高位作为其符号位,用"1"表示"+"(正数),"0"表示"-"(负数),其余各位则用来表示数值的大小 这道题里没有强调计算机内部补码问题,所以和具体编码无关,当然计算机里都是用补码来进行运算的. 题目...

龙海市19559429760: 数字计算机系统中最常用的整数表示方法 -
闽刮鼻炎: 符号幅值表示法,补码体系,反码

龙海市19559429760: 为什么现代计算机都用补码来表示整数 -
闽刮鼻炎:[答案] 机器数用补码表示的好处: 原码简单,适用于乘除运算,但用原码表示的数进行加减法运算比较复杂. 补码,减法运算可以用加法来实现,例如 [X-Y]补 = [X]补 +[-Y]补, 而且,数的符号位也可以参与运算,便于运算结果的正负及是否溢出判断. 因...

龙海市19559429760: 整数的计算机表示 -
闽刮鼻炎: 是的.最高位是符号位. 看来你刚刚开始接触补码.加油啊.

龙海市19559429760: 在计算机中,整数的正,负号是怎么表示的 -
闽刮鼻炎: 对于有符号整型来说,是通过符号位(最高位)来表示的.为0则为正数,为1则为负数.

龙海市19559429760: 定点整数的表示形式 -
闽刮鼻炎: [dìng diǎn shù] 定点数:拼音:dìng diǎn shù 计算机中采用的一种数的表示方法.参与运算的数的小数点位置固定不变.

龙海市19559429760: 计算机中,如何表示实数和整数 -
闽刮鼻炎: 都是二进制代码,从左到有,根据位数不同,左面补零

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网