c语言中无符号和有符号之间的运算

关于计算机中有符号,无符号数值的表示以及它们之间的运算 是基本知识,但工作这么多年也不敢说完全搞明白透彻。

这几天在将知识点进行了一些梳理,并做了一些有意思的试验。

计算机中,数值的表示和运算都是用补码表示的。 正数的补码就是其本身; 负数的补码则是最高符号位为1,其余位取反加1. 比如-5表示为0xFFFB, 而5则表示为0x0005。

这里,第一个需要注意的问题就是 有符号数和无符号数之间的运算。 c语言规定,先一律转成无符号数,然后再进行运算。

比如,  int iValue1 = -5;  unsigned int uValue2 = 2;    则 iValue1+uValue2的值和(unsigned int)iValue1 + uValue2一样,都为0xFFFD

还有一个意思的话题就是 有符号数值之间的除法 跟右移不是等价的。 比如 -5/4 是不等于 -5>>2  前者的结果是0xFFFF  而后者为 0xFFFE

先解释前者, 对于有符号数的相除,它实际等式为 (-5+4-1) >>2 = (0xFFFB+0x03)>>2=0xFFFF 有符号的算术右移,空出来的高位都用MSB符号位取代;

就后者而言, -5>>2 就是直白的算术右移, 转换为 0xFFFB>>2=0xFFFE

最后要强调的是 对于无符号数的除法和右移则是等价的, 比如 5/4 = 5>>2

时间: 2024-11-08 19:04:15

c语言中无符号和有符号之间的运算的相关文章

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; } 答案是:>6 第二题 #include<stdio.h> int m

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

java中无符号类型的处理

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取. Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:(1)int   readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑

java中无符号类型的处理[转]

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取. Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法: (1)int  readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,

深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言中的有符号数和无符号数 上一篇博客我们给出了C语言中在32位机器和64位机器中支持的整型类型数据,我们这里只给出32位机器上的: 尽管 C 语言标准没有指定有符号数要采用某种编码表示,但是几乎所有的机器都使用补码.通常大多数数字是默认有符号的,比如当声明一个像12345或者0xABC这样的常量的时候

关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d

JavaScript中无符号右移赋值操作

无符号右移赋值操作 (>>>=)是对变量值根据表达式值所规定的位数进行无符号右移,并将结果赋给该变量.示例代码: result >>>= expression 其中参数是result任何变量. expression是任何表达式. JavaScript中无符号右移赋值操作说明 使用 >>>= 运算符和使用下面的语句是等效的:health.hljmlyfcyy.com result = result >>> expression >

C语言中的运算符号

C语言中的符号--具体用法问度娘 运算符的种类 语言的运算符可分为以下几类: 1 算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(--)共七种. 2.关系运算符 用于比较运算.包括大于(>).小于(<).等于(==). 大于等于(>=) .小于等于(<=)和不等于(!=)六种. 3.逻辑运算符 用于逻辑运算.包括与(&&).或(||).非(!)三种. 4.位操作运算符 参与运算的量,按二进制位进行