有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密。

先来看看下面代码:

int main()
{
      unsigned int val = -1;
      cout<<val<<endl;

return 0;
}

执行的结果:

4294967295
请按任意键继续. . .

----------------------------------------

你可能禁不住惊叹:这么大!没想到吧,把一个负数赋值给无符号整型变量,会产生这么大的数!为啥呢?好,我们一步步分析:

首先,仔细观察输出的结果4294967295,发现4294967295=2^32-1,哦!好像有点规律!但是,又为啥会是这样?让我们先来讨论下int和unsigned int的表现形式,其中他俩都是4个字节,32位的二进制表示,但int有一位是符号位,unsigned则没有。那-1的int类型表示为1000 0000 0000 0000 0000 0000 0000 0001,那么将其强制转换成unsigned int 应该是1000 0000 0000 0000 0000 0000 0000 0001(红色为符号位),用指数表示是2^31+1,而不是2^32-1!这是怎么回事呢?(*^__^*) 嘻嘻……,这里还隐藏着一个小秘密!那就是int在真正存储在内存中的二进制数不是值的原码,而是其补码(为了便于运算,可以参考《数字逻辑》)!那么在强制类型转换之前,int变量-1内存中存储的是1111 1111 1111 1111 1111 1111 1111 1111,等于2^32-1。soso在强转为unsigned int时,就是读取该块内存的值赋给变量!这样val就变成了4294967295,超级大的数!所以各位同仁在处理unsigned int 赋值时一定要谨慎!如果出错将影响甚大,因为unsigned int一般都会作为for或while循环体的标识类型,如果将负值赋给它,将导致严重的假死循环!痛哉!痛哉!

远离陷阱,珍惜生命!O(∩_∩)O哈哈~

负数赋值给无符号数的陷阱[转]相关推荐

  1. 负数赋值给无符号数的陷阱【转】

    有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密. 先来看看下面代码: int main() {       unsigned i ...

  2. 有符号数与无符号数之间运算问题

    欢迎探讨,感觉写的不能达意. 1 读了<深入理解计算机系统>后,觉得下面{{{{  }}}}}所有内容可以总结为如下,无符号数与有符号数间的转换就是数值在内存的位模式不变,改变的是对位模式 ...

  3. 无符号数运算相减/有符号数表示运算问题(一)

    参考链接:https://blog.csdn.net/qq_38608897/article/details/103966054?utm_medium=distribute.pc_relevant.n ...

  4. csapp:无符号数可能造成的程序bug

    出自csapp练习2.26 size_t strlen(const char *s); int strloner(char *s,char *t) {return strlen(s)-strlen(t ...

  5. C++中含有无符号类型的表达式——有符号数与无符号数相加

    首先,明确一个概念,什么是有符号数,什么是无符号数.以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数.unsigned  int 只可以表示正整数,所以成类似的数为无符号数 ...

  6. 有符号数和无符号数之间的转换(2020)C

    有符号数和无符号数之间的转换 C语言允许在各种不同的数字数据类型之间做强制类型转换.例如,假设变量x声明为int,u声明为unsigned.表达式(unsigned)x会将x的值转换成一个无符号数值, ...

  7. 给无符号数赋值负数(有符号数)的理解(unsigned\signedf)

    无符号数赋负数(有符号数)就类似于给字符型变量赋数值(char word=0x56),对相同的值不同的类型解析 //s16:signed short; u16:unsigned shorts16 te ...

  8. 无符号数和有符号数之间赋值和大小比较

    unsigned int a = -1; printf("a = %d", a); printf("a = %u", a); int b = 301234567 ...

  9. C语言无符号数赋值为负数时的%d%u输出问题解释

    文章目录 问题发现 什么是无符号整形 补码的计算 无符号整形的输出 正确时: 错误时: 问题解决 int用%d和%u输出 unsigned int用%d和%u输出 问题发现 近日在练习过程中发现无符号 ...

最新文章

  1. js 跨页面的全局变量
  2. Spark-快速上手
  3. 果蝇玩VR登Nature,发现注意力机制、工作记忆都有,昆虫大脑原来没比哺乳类差多少...
  4. Android 通过onTouchEvent判断是否为双击事件
  5. UScript中的Pow函数
  6. Linux系统:软链接与硬链接的原理分析
  7. JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)
  8. java.lang.relect.Array 类
  9. 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
  10. leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263
  11. squid代理与缓存(下)
  12. NOIP2018普及T2暨洛谷P5016 龙虎斗
  13. 【EOS】1.环境搭建
  14. 软件设计师教程---第一章计算机系统知识
  15. Zynq7020 PS 软件复位
  16. 秒杀系统设计要点总结
  17. 软件测试的四个阶段,单元测试、集成测试、系统测试、验收测试
  18. 揭密中国500岁世外异人的真实生活
  19. Flutter 自定义组件实战
  20. electron打开系统默认浏览器

热门文章

  1. TypeNotPresentExceptionProxy异常解决
  2. 松果时序数据库---产品介绍
  3. IOS开发资料地址大全
  4. Goodwin模型参考自适应控制方案
  5. Java 微信公众号开发(一) 介入微信
  6. 蓝牙及其安全技术概述
  7. Route [register] not defined. 的解决办法
  8. 计算机原理中断电丢失,小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?...
  9. 【STM32F407开发板用户手册】第26章 STM32F407的定时器应用之TIM1-TIM14的中断实现
  10. Nat Methods|一个快速搜索工具能让所有人都能进行蛋白质结构预测