c++primer5遇到了这个-1对256取模,负数取模还真的不清楚,所以查了查资料,供大家参考。

  原文是这样说的:C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表示数值总数取模后的余数。所以,如果把-1赋给8位的unsigned char,那么结果是255,因为255是-1对256求模后的值。

  1.从数学角度解读:

  取模运算时,对于负数,应该加上被除数的整数倍,使结果大于或等于0之后,再进行运算.

  也就是:(-1)%256 = (-1+256)%256=255%256=255
  2.计算机存储角度:

  计算机中负数是以补码形式存储的,-1的补码11111111,转换成无符号数即是255的二进制编码。

  3.数据类型转换角度:(以下引用csdn论坛的多位答主的回答)这个运算其实就是数据类型的提升和隐式转化的问题如果是unsigned char a = -1;那么a%256经过了这么几步,1.a 从 unsigned char 类型提升到 int,就是 0x000000ff2.然后0x000000ff 与256取模 就是 0x000000ff下面把 a%256的结果(0x000000ff)赋给一个变量,这一步会导致输出的值到底是-1还是255,第一种可能:unsigned char b = a%256; //0x000000ff从int转化为unsign char发生字节截断 就变为0xffprintf("%d",b);          //0xff从 unsigned char 类型提升到 int,就是 0x000000ff 所以输出应该为255第2种可能:char b = a%256; //0x000000ff从int转化为char发生字节截断 就变为0xffprintf("%d",b); //0xff从 char 类型提升到 int,就是 0xffffffff,这里是关键,有符号和无符号数的类型提升,编译器采取不同的处理方式, 所以输出应该为-1当然你直接输出printf("%d",a%256);//其实就是把0x000000ff直接输出,那应该是255另外如果是char a = -1; 也可以根据类型提升和隐式转换得出结果,这个跟编译器应该没什么关系.一般来说(char,unsigned char,short,unsigned short)在做运算时候都会被类型提升到 int,再从int转化到float(如果有)什么的,最后在根据目标变量类型,把算出来的中间结果进行类型转化,就可以得到结果,再举个例子unsigned char a = 0x1;unsigned char b = 0xff;unsigned char c = a+b; //c 的结果是 0x0;int d = a+b;//d的结果是0x00000100c++一段代码验证:

1 unsigned char uc;    //声明一个无符号的字符,8位的,无符号字符类型的取值个数为256。
2 uc=-1;               //将-1赋给无符号的字符型对象(变量),
3                      //此过程会先将-1自动转换为无符号数,即 11111111 11111111,然后赋值给uc
4                      //但是uc只有8位,所以只保存了 11111111 11111111 的低8位数据,其它的位
5                      //就因为溢出而丢失了。-----因为溢出而丢失了其它位,就相当于取模运算了。
6 cout<<"uc as int is :"<<int(uc)<<endl;    //这一行将uc转换为整型输出,结果为255
7 //注意,11111111 11111111 是十六位的,但实际上也可能是32位的,因为我们现在的计算机都是32位的了。

  再贴上摘自百度百科的取模和取余的区别:

  取模运算(“Modulo Operation”)和取余运算(“Remainder Operation”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。

对于整型数a,b来说,取模运算或者求余运算的方法都是:

1.求 整数商: c = a/b;

2.计算模或者余数: r = a - c*b.

求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

例如:计算-7 Mod 4

那么:a = -7;b = 4;

第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);

第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。

归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。

另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

自己理解:

通常,取模运算也叫取余运算,它们返回结果都是余数.rem(取余)和mod(取模)唯一的区别在于: 当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。

   

参考链接:http://bbs.csdn.net/topics/190074689

https://www.cnblogs.com/houqi/p/5644384.html

负数转无符号运算 (-1对256取模)相关推荐

  1. java 无符号运算_java位运算和无符号运算

    计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...

  2. 负数转换为无符号数据类型的理解及应用

    负数转换为无符号类型数据的理解及应用 负数转换为无符号数据类型的理解及应用 有符号整型和无符号整型的转换 有符号类型和无符号类型的转换应用实例 参考文献 负数转换为无符号数据类型的理解及应用 网上有大 ...

  3. java8 无符号_Java8包装类 新增 无符号运算方法

    Java8为整型包装类,增加类支持无符号运算的方法. Java8为Integer,Long新增如下方法 static String toUnsignedString(int/long i):该方法将指 ...

  4. 移位运算与除法、取模运算

    0. 整除与取模 xmody=x−y⋅⌊x/y⌋ x\mod y=x-y\cdot \lfloor x/y\rfloor 1. 应用 求一个数二进制形式 1 出现的次数: int bitCount(i ...

  5. x86架构下 CF与OF标志位 带符号和无符号运算 详解

    针对能够影响OF和CF标志位的指令,一般来说是涉及到数据运算的指令,这里使用add举例,即不区分有无符号的加法指令,参与运算的数据,从二进制层级去考虑. CF标志位 对于CF,它是carry flag ...

  6. Verilog有符号和无符号运算设计分析

    主要内容是对有符号数和无符号数在设计时,数据是怎样传递的,符号位是怎样来的,以及相关的几种运算设计应当遵循怎样的想法. 最近对加减乘除运算很困惑,主要是对于有符号数的运算的困扰,如果运算出现负数怎么办 ...

  7. java 无符号运算_不用加减乘除符号实现四则运算(整数)--JAVA

    这种面试题...能想到的就是用位运算代替 在讲解之前,首先普及一点知识 与运算(全一才是一): 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 ...

  8. python取模运算_Python中的取模运算方法

    所谓取模运算,就是计算两个数相除之后的余数,符号是%.如a % b就是计算a除以b的余数.用数学语言来描述,就是如果存在整数n和m,其中0 <= m < b,使得a = n * b + m ...

  9. 大数取模运算,快速幂取模运算

    1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值. ...

最新文章

  1. 马尔科夫、最大熵、条件随机场
  2. 测试用例设计之正交表法详解
  3. mysql header files_编译安装php Cannot find MySQL header files under /usr/include/mysql.
  4. 补习系列(5)-springboot- restful应用
  5. 升序堆和降序堆(优先队列) 洛谷1801
  6. linux bitmap save 图片_Linux内核浅析-进程调度时机和过程
  7. python动态生成数据库表_带有SQLalchemy的动态表名
  8. db2 正则匹配_SQL正则表达式
  9. 来自 100 年前不可思议的绘画预言
  10. 2023年全国管理类联考综合试卷真题及解析
  11. XMind使用教程入门
  12. Ubuntu20.04设置网络共享文件夹
  13. prepare for 快手
  14. 手机wps云文档无法连接服务器,手机wps云文档怎么用
  15. php提取文章图片作缩略图,Wordpress自动提取文章内第一张图作为缩略图方法 | WordPress指南...
  16. 【OpenCV3经典编程100例】(26)2D特征:Shi-Tomasi角点检测goodFeaturesToTrack()函数
  17. 手把手,​教你如何逐步提高JavaScript的编码能力?
  18. python获取mysql中的数据供js调用_python 读取mysql数据至csv文件中,并发送邮件
  19. 【论文相关】论文管理神器-zotero(最详细的使用说明)
  20. 华为拿数百亿资金给员工分红,2021年每股可分1.58元

热门文章

  1. 局域网两台计算机网速,多台电脑在同一个局域网内如何合理分配网速上网
  2. C#中窗体绑定键盘按钮
  3. 用exe4j将jar转为exe可执行程序
  4. mcinabox运行库下载安装_手机mcinabox运行库安装包下载-mcinabox运行库文件手机版下载v1.0_289手游网...
  5. 将沁园春长沙写出来使用html css,高一语文教案:《沁园春长沙》教案设计二
  6. RecyclerView使用GridLayoutManager实现两种item
  7. Bugtags 移动时代bug管理系统利器
  8. HDU 4546 比赛难度
  9. android更新天气简单方法,简单教你如何编写Android天气预报小程序
  10. 浙大郑烨:一位寒门状元的重生