有符号数与无符号数的除法

(2010-11-08 16:01:36)

正在上传…重新上传取消​转载▼
标签:

it

分类: IT
这样一个问题:

int a = -2; printf("%d,%d", a/4*4, a/4U*4);
打印出的是:0,-4
有符号数与无符号数做除法时,双方都转为无符号数再做除法;
-2在计算机中的存储形式为:0xff ff ff fe
作为无符号数除以4时,向右移2位(左边补零),中间结果为0x3f ff ff ff
之后乘以4时,向左移位(右边补零),结果为oxff ff ff fc
该数字表示有符号数-4,于是-4就被打印出来。
参见文章:如流,新一代智能工作平台
【转】 有关C语言中有符号/无符号数混合运算的小问题
2010年08月25日 星期三 18:51
转载自 yjpro
最终编辑 yjpro
这两天的工作需要涉及到对无符合数,有符号数作混合运算。

作了一些实验,发现自己写了这么多年的程序,以前对于符号数计算相关的理解居然仍存在一些盲点。

有符号数与无符号数混合运算可能有三种混合方式

1。操作数全为有符号数
如:

int a = -1;
int b = 2;
a + b;

2。操作数全为无符号数
如:

unsigned int a = (unsigned int)-1;
unsigned int b = 2;
a + b;

3。操作数混合了有符号数,无符号数
如:

int a = -1;
unsigned int b = 2;
a / b;

情形1和2就不用说了,因为运算中涉及的都是相同符号特征的操作数,计算过程中不会引起歧义。

而对于情形3,由于涉及到了符号特性相异的操作数,情况就有些复杂了。

这里先说一下,对于有些运算操作,是要区分有符号与无符号的情况的。比如有符号的除法与无符号

的除法,有符号的取模运算与无符号的取模运算,其计算语意是不同的,具体来说,有符号的除法在x86

平台上对应的汇编指令是idiv,而无符号的除法对应的则是div

对于另外一些操作运算,则是不区分有符号与无符号的,比如,加法,减法,乘法运算。

对于不同操作符与符号相关的情形可以通过下面的小程序来验证:

int main()
{

signed int n1 = 1;
signed int n2 = 2;
unsigned int u1 = 1;
unsigned int u2 = 2;

signed int a = n1 + n2;
unsigned int ua = u1 + u2;

signed int s = n1 - n2;
unsigned int us = u1 - u2;

signed int m = n1 * n2;
unsigned int um = u1 * u2;

signed int d = n1 / n2;
unsigned int d = u1 / u2;

signed int m = n1 % n2;
unsigned int um = u1 % u2;

return 0;
}

对这一段程序调用 g++ -S,生成相应的汇编文件,就会发现:

加法运算,无论是有符号还是无符号,对应的都是addl指令,

减法运算,对应的都是subl指令,

乘法运算,对应的都是imul指令,

有符号除法运算对应的是idiv指令,无符号除法对应的则是 div指令,

有符号数取模运算会用到idiv指令,无符号取模用的则是div指令。

所以回到初始的问题,情形1和2的行为是容易预期的,因为所有操作数都具有同样的符号特性,直接就

可以得出采用相应符号特性的运算类型。

对于情形3,因为涉及到不同符号数的混合计算,在计算之前需要先对操作数进行规整化的动

作,规整的原则就是如果操作数中存在至少一个无符号数,则所有操作数都被转化为无符号数,

运算操作也采用相应的无符号操作符进行,计算完的结果也是一个无符号数。

举例来说:

(unsigned int)a / (signed int)b 会采用无符号除法进行,其实质相当于

(unsigned int)a / (unsigned int)b

计算结果也是一个无符号数。

再进一步,对于运算-2 / -1,如果采用有符号数运算,结果是1,采用无符号数运算,结果则是0

所以 (signed int)(-2) / (unsigned int)(-1)的结果就是0了。

除法,取模这样的操作符在不同的上下文语境里对应的语义动作也有所不同,而且这种差异还不

同于c++里的操作符重载在语言级别可见,而是要到更底层的汇编语言级别才可见,这多少就有

一些tricky,也容易诱使程序员犯错了。如果有机会我来设计一门语言,我想自己会尽量避免引

入这种tricky的东西的。

有符号数与无符号数的除法(转载)相关推荐

  1. 11-有符号数和无符号数

    1. 有符号数和无符号数 无符号数,因为没有符号位,所以只能表示一个正数. 有符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数. 我们可以用db伪 ...

  2. 计算机怎么识别有符号数和无符号数的

    这个问题我在学习汇编语言的过程中一直很苦恼,在网上看了很多帖子,基本上都是说是人自己设定是有符号数还是无符号数的.这样的回答是很扯淡的,TM计算机和人脑又不是一个东西,看来很多人学东西基本上都是一知半 ...

  3. 怎么区分有符号数和无符号数

    转载至:http://www.myexception.cn/program/1264261.html 我还是搞不清指令本身是如何区分有符号数和无符号数!(问题汇总) 论坛的一个CSDN提问,对各方面的 ...

  4. 关于有符号数和无符号数

    关于有符号数和无符号数 最近,在讨论有符号数和无符号数在计算机中的表示的问题,结果越讨论越乱.而且使用C语言胡乱验证了一番,最后发现使用了C语言的工具,竟然使得数据真正存储的事实更加令人迷惑.从一个侧 ...

  5. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  6. 理解有符号数和无符号数的区别

    理解有符号数和无符号数 回头看上一节,我们所讲的数都是正数.同样是年纪和工资,前者不需要有负值,但后者可能需要--至少所有的老板都这样认为. 那么,负数在计算机中如何表示呢? 这一点,你可能听过两种不 ...

  7. c语言中的无符号字节,C语言之有符号数和无符号数

    我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...

  8. C\C++不经意间留下的知识空白------有符号数和无符号数

    C和C++ C和C++应该是大多数工科生最先接触的两门语言,个人感觉这两门还是挺难的.今天在看面试题时,看到有符号数和无符号数时竟然懵了,这基础是有多不扎实啊! 有符号数和无符号数 对于浮点数来说都是 ...

  9. 各种类型sizeof大小及C++有符号数与无符号数进行比较

    不同类型sizeof相关: class A {}; class B { char m_data;}; class C {char m_data[100]; }; class D {char* m_da ...

最新文章

  1. 远离极限编程 (Don’t do XP)
  2. JVM_06 垃圾回收相关算法 [ 一 ]
  3. 放大镜制作(2)—此方法比较容易理解
  4. Visual Studio Code 开发 .NET Core 看这篇就够了
  5. Java Bootstrap:Dropwizard与Spring Boot
  6. mysql中join各种形式大全及操作和图片
  7. C#写的制程能力CPK分析程序
  8. python3 爬取搜狗微信的文章
  9. 计算机文本格式含义,文本格式是什么意思
  10. 从零开始的运维之路【标题党】
  11. 最近心血来潮,准备更新博客
  12. 智能生活管家项目之一-系统简介
  13. 大二单片机笔记,串口通信代码【郭天祥】【700字】【勿笑】【原创】
  14. 什么是线性表?线性表的特点,线性表的顺序存储和链式存储
  15. Taro小程序组件传值
  16. 【C语言】运算符优先级
  17. 软件测试之微软学术搜索(Microsoft Academic Search)
  18. 数据结构 python的书推荐-学习数据结构,有哪些值得推荐的好书?
  19. java eclipse sbt_无法安装sbt-eclipse插件
  20. 聚水潭完成3亿元B3轮融资,红杉资本中国基金独家投资

热门文章

  1. 码分多路复用 CDM
  2. 嵌入式下的Hello World——点亮流水灯(STM32cubemx)
  3. Word奇偶页的页眉页脚设置
  4. 究竟怎样写代码才算是好代码
  5. 响铃:“新品牌计划”出炉,但拼多多要的不只是C2M
  6. MySQL 架构与内部模块
  7. 【Linux】单网卡设置双ip的方法
  8. 队列(一种遵循先进先出原则的数据结构)
  9. 摄像头8mm可以看多远_监控摄像头有多少种,如何来选型
  10. 欧几里德距离、欧拉距离