负数赋值给无符号数的陷阱[转]
有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密。
先来看看下面代码:
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哈哈~
负数赋值给无符号数的陷阱[转]相关推荐
- 负数赋值给无符号数的陷阱【转】
有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密. 先来看看下面代码: int main() { unsigned i ...
- 有符号数与无符号数之间运算问题
欢迎探讨,感觉写的不能达意. 1 读了<深入理解计算机系统>后,觉得下面{{{{ }}}}}所有内容可以总结为如下,无符号数与有符号数间的转换就是数值在内存的位模式不变,改变的是对位模式 ...
- 无符号数运算相减/有符号数表示运算问题(一)
参考链接:https://blog.csdn.net/qq_38608897/article/details/103966054?utm_medium=distribute.pc_relevant.n ...
- csapp:无符号数可能造成的程序bug
出自csapp练习2.26 size_t strlen(const char *s); int strloner(char *s,char *t) {return strlen(s)-strlen(t ...
- C++中含有无符号类型的表达式——有符号数与无符号数相加
首先,明确一个概念,什么是有符号数,什么是无符号数.以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数.unsigned int 只可以表示正整数,所以成类似的数为无符号数 ...
- 有符号数和无符号数之间的转换(2020)C
有符号数和无符号数之间的转换 C语言允许在各种不同的数字数据类型之间做强制类型转换.例如,假设变量x声明为int,u声明为unsigned.表达式(unsigned)x会将x的值转换成一个无符号数值, ...
- 给无符号数赋值负数(有符号数)的理解(unsigned\signedf)
无符号数赋负数(有符号数)就类似于给字符型变量赋数值(char word=0x56),对相同的值不同的类型解析 //s16:signed short; u16:unsigned shorts16 te ...
- 无符号数和有符号数之间赋值和大小比较
unsigned int a = -1; printf("a = %d", a); printf("a = %u", a); int b = 301234567 ...
- C语言无符号数赋值为负数时的%d%u输出问题解释
文章目录 问题发现 什么是无符号整形 补码的计算 无符号整形的输出 正确时: 错误时: 问题解决 int用%d和%u输出 unsigned int用%d和%u输出 问题发现 近日在练习过程中发现无符号 ...
最新文章
- js 跨页面的全局变量
- Spark-快速上手
- 果蝇玩VR登Nature,发现注意力机制、工作记忆都有,昆虫大脑原来没比哺乳类差多少...
- Android 通过onTouchEvent判断是否为双击事件
- UScript中的Pow函数
- Linux系统:软链接与硬链接的原理分析
- JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)
- java.lang.relect.Array 类
- 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
- leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263
- squid代理与缓存(下)
- NOIP2018普及T2暨洛谷P5016 龙虎斗
- 【EOS】1.环境搭建
- 软件设计师教程---第一章计算机系统知识
- Zynq7020 PS 软件复位
- 秒杀系统设计要点总结
- 软件测试的四个阶段,单元测试、集成测试、系统测试、验收测试
- 揭密中国500岁世外异人的真实生活
- Flutter 自定义组件实战
- electron打开系统默认浏览器
热门文章
- TypeNotPresentExceptionProxy异常解决
- 松果时序数据库---产品介绍
- IOS开发资料地址大全
- Goodwin模型参考自适应控制方案
- Java 微信公众号开发(一) 介入微信
- 蓝牙及其安全技术概述
- Route [register] not defined. 的解决办法
- 计算机原理中断电丢失,小老板,我学的计算机组成原理告诉我半导体存储器都是断电后丢失的,为什么U盘SSD(固态硬盘)没事呢?...
- 【STM32F407开发板用户手册】第26章 STM32F407的定时器应用之TIM1-TIM14的中断实现
- Nat Methods|一个快速搜索工具能让所有人都能进行蛋白质结构预测