博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机系统中的整数运算
阅读量:4647 次
发布时间:2019-06-09

本文共 1217 字,大约阅读时间需要 4 分钟。

上一篇随笔中介绍了“”,本文继续探索整数运算的本质。
 
计算机系统内的整数运算的局限:
  表示整数的二进制位是一定的,所以表示的整数的范围是局限的。
“整数”运算实际上是一种模运算:
  表示数字的有限字长限制了可能的取值范围,结果运算可能溢出,所以运算结果都是取模之后的。
 
 
无符号加法
一个算术运算溢出,是指完整的整数结果不能放到数据类型的字长限制中去。
C语言中真正执行的无符号加法:
+
uw  (用这种符号区别标准的加法; + 表示标准的加法),又称为 模数加法。
  
                 
= (x+y)mod 2^w

 

整数加法和无符号加法间的关系。当x+y大于2w-1时,其和溢出。

 例如:(231 = 2147483648)

unsigned int u1=2147483648u+2147483647u;        printf("u1=%u\n",u1);        unsigned int u2=2147483648u+2147483647u+1;        printf("u2=%u\n",u2);

输出:u1=4294967295

     u2=0

 

补码加法
在计算机计算中,通常将表示截断到w位,来避免数据大小的不断扩张。C语言中真正执行的补码加法: +t
w(用这种符号区别标准的加法)

 

 

整数和补码加法之间的关系:

当x+y小于-2w-1,产生负溢出。当它大于2w-1 -1时,产生正溢出。

例如:(int类型的最大正数为:231-1 = 2147483647)

int y=2147483647+1;        printf("y=%d",y);

输出:y=-2147483648 

 

补码的非运算

 

无符号乘法
其中 x*y指实数内的乘法。

有符号乘法

 

乘以常数
对于无符号和有符号变量x:C表达式 x<<k 等价于 x*2^k。 
(左移运算)
(可以理解为:这是对二进制表示的运算,无符号和有符号是对二进制表示的两种解释)
例如:14=2^3+2^2+2  所以 x*14=(x<<3)+(x<<2)+(x<<1)
      或14=2^4-2  所以 x*14=(x<<4)-(x<<1)
         -6=2-8    所以  x*(-6)=(x<<1)-(x<<3)
 
 
除以2的幂
整数除法总是舍入到零,对于x>=0,y>0  ,结果是
 
(下取整),对于x<0,y>0,结果是
(上取整)
 
对于无符号变量x:C表达式x/2^k等价于x>>k。
(逻辑右移)
对于有符号变量(补码)x:表达式x/2^k等价于(x<0 ?  (x + (1<<k) -1)  : x ) >>k。
(算术右移)
     (当x<0时,x上加上一个适当的偏移量(2^k-1),再执行算术右移,使结果正确舍入)

 

(转载请注明出处 ^.^)

转载于:https://www.cnblogs.com/windlaughing/archive/2013/04/03/2997910.html

你可能感兴趣的文章
SharePoint2010 -- 管理配置文件同步
查看>>
.Net MVC3中取得当前区域的名字(Area name)
查看>>
获得屏幕像素以及像素密度
查看>>
int与string转换
查看>>
adb命令 判断锁屏
查看>>
推荐一个MacOS苹果电脑系统解压缩软件
查看>>
1035等差数列末项计算
查看>>
CDMA鉴权
查看>>
ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
查看>>
过滤器与拦截器区别
查看>>
USACO 1.5.4 Checker Challenge
查看>>
第二阶段站立会议7
查看>>
[18]Debian Linux Install GNU GCC Compiler and Development Environment
查看>>
JAVA多线程
查看>>
ACE(Adaptive Communication Environment)介绍
查看>>
delphi 更改DBGrid 颜色技巧
查看>>
python编码问题
查看>>
POJ 2031 Building a Space Station
查看>>
面向对象1
查看>>
编程开发之--java多线程学习总结(5)
查看>>