有符号数与无符号数的四则运算
来源:互联网 发布:java对特殊字符转义 编辑:程序博客网 时间:2024/05/21 09:47
有符号数与无符号数作四则运算
基本原则:
1、一般singed 型数据和unsigned型数据进行四则运算,是要转换成unsigned的,
2、两种数据类型相乘,会将其转换成范围更广的数据类型,再作运算。如unsigned short 与int相乘,会被转成int再作相乘,其最终结果也被认为是有符号的
例:
1)
unsigned short a;
int b;
a*b 将会被认为是一个有符号型 ( int 型的表示范围比unsigned short型表示范围更宽 )
2)
unsigned int a;
int b;
a*b 将会被认为是一个无符号型 ( unsigned int型的表示范围比 int型表示范围更宽 )
3)操作数混合了有符号数,无符号数
int a = -1;
unsigned int b = 2;
b/a;
int a = -1;
unsigned int b = 2;
b/a;
对于该情形,因为涉及到不同符号数的混合计算,在计算之前需要先对操作数进行规整化的动
作,规整的原则就是如果操作数中存在至少一个无符号数(前提要求两个操作数据位长是一致的,该例中都是32位),
作,规整的原则就是如果操作数中存在至少一个无符号数(前提要求两个操作数据位长是一致的,该例中都是32位),
则所有操作数都被转化为无符号数,
运算操作也采用相应的无符号操作符进行,计算完的结果也是一个无符号数。
举例来说:
运算操作也采用相应的无符号操作符进行,计算完的结果也是一个无符号数。
举例来说:
(unsigned int)b / (signed int)a 会采用无符号除法进行,其实质相当于
(unsigned int)b / (unsigned int)a
计算结果也是一个无符号数,结果为(unsigned int)2 / (unsigned int)-1 = 0x2/0xFFFFFFFF = 0
再进一步,对于运算-2 / -1,如果采用有符号数运算,结果是2,采用无符号数运算,结果则是0。
举例
在工作中遇到一个问题,
unsigned short a1 = 1920;
unsigned short a2 = 3840;
a1*2^20 计算得出为一个正数 ( a1为unsigned short型,2^20为int型,计算时会先转换成int型再作运算,最终结果将是int型 )
1920 * 2^20 = 0x78000000 ( int 型0x78000000实际也是一个正数 )
a2*2^20 计算得出为一个负数
3840 * 2^20 = 0xF0000000 = -268435456 ( int型0xF0000000实际是一个负数 )
分析如下
2^20 * 1920 = 0x78000000
2^20 * 3840 = 0xF0000000
在计算机中,将0xF000000当作一个负数作处理,其数值为-268435356 ( 具体转化过程参考另一文档《负数在计算机中如何表示?》 )
如下所示code的结果为
-268435456
fffdddde 167d30
-139810 1473840
<span style="font-size:14px;">#include <stdio.h>main(){unsigned short InW1 = 3840;unsigned short OutW1 = 1920;unsigned short InW2 = 1920;unsigned short OutW2 = 1366;unsigned int Factor1;unsigned int Factor2;int parameter = (1<<20);Factor1 = (InW1*parameter)/OutW1;Factor2 = (InW2*parameter)/OutW2;printf("%d\n",(InW1*parameter));printf("%x %x \n",Factor1, Factor2);printf("%d %d \n",Factor1, Factor2);}</span>
分类: C语言
0 0
- 有符号数与无符号数的四则运算
- 无符号数与有符号数
- 有符号数与无符号数
- 有符号数与无符号数
- 有符号数与无符号数
- 无符号数与有符号数的操作
- 无符号数与有符号数的操作
- 无符号数与有符号数转换的原理
- 有符号数与无符号数的运算
- 关于有符号数与无符号数的建议
- 有符号数与无符号数之间的转换
- 关于有符号数与无符号数的建议
- 无符号数与有符号数相加的结果
- 有符号数与无符号数的加减法
- 有符号数与无符号数之间的运算
- 有符号与无符号数转化
- 有符号与无符号数的隐式转换
- 汇编中有符号与无符号数的区分
- xml形式数据解析
- Git学习笔记(二)
- QT单例模式的宏实现
- OpenJDK和JDK区别
- javascript 观察者模式
- 有符号数与无符号数的四则运算
- Core Animation CALayer动画
- 系列1—BabeLua入门
- 数独求解
- Light OJ 1258 Making Huge Palindromes 末尾添加最少字符变回文串
- 我们感叹青春的流逝、却不能停下脚步
- 企业供应链管理与贸易融资的那些事儿
- 无缝滚动
- Javascript: unterminated string literal 解决方法 ---- json 包含换行及其他一些特殊字符