前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(不要告诉我你懂加法)

C语言(不要告诉我你懂加法)

作者头像
用户2617681
发布2019-08-08 11:23:04
8550
发布2019-08-08 11:23:04
举报
文章被收录于专栏:秘籍酷

就在刚才!正在研究南海局势,突然手边闯进来一个难产般的面试题,乍一看是一道加法题,一执行发现与常理相悖,我顿时面如土色,坏了!明天马上就要奔袭南海了,这下怎么办?怎么办?这该不会是美国间谍故意来拖延我时间,以免明天在南海跟我硬碰硬使出的阴招吧?!

某美国间谍,想用如下面试题,来困扰我,以此达到不可告人的秘密。在此我强烈建议小伙伴们先别看以下代码分析,先自己亲手把下面的代码写一遍,编译一遍,自己猜猜结果会是什么,然后执行一遍试试看。你就会看到美帝亡我之心不死!

unsigned int a = 6; int b = -20; if(a + b > 0) printf("a+b: %d\n", a+b); else printf("you will get nothing.\n");

这么简单的代码,乍一看,a+b 明显等于 -14 ,因此if语句不可能成立,程序的执行结果不就是打印出 you will get nothing.这么一句话吗? 但是事情的结果往往是出乎意料的,居然打印的是:

a+b: -14

这就奇了怪了!!既然结果是-14,那这个if语句就不成立,既然不成立,那这句话又怎么打印出来了? 见了鬼了!绕了个圈居然出现悖论! 这里面究竟有什么阴谋? 美帝究竟在打什么算盘!? 我陷入了深深的思考,百思不得其姐!

慢着,仔细观察 a+b > 0 这语句你会发现,该语句中出现了无符号数、有符号数,同时右边的0也是一个int型数据,辣么,根据C语言的数据隐式转换规则,数据将会统统被转成无符号数

既然如此,-20就会变成一个巨大无比的正整数,因为负数在内存中是以补码的形式存在的,此时-20的真正内存这样的:

1111 1111 1111 1111 1111 1111 1110 1100

总共占用32位内存,即4个字节。

这个数值一旦跟无符号数一起运算,立即按正码计算,被当成是无符号数,即4294967276,一个好好的-20瞬间变成40多亿,然后再加个6,能不比0大吗? 因此,if语句必然成立。

那在printf语句中,怎么又不是打印40多亿,而是规规矩矩的-14呢?那是因为 %d 作怪,%d不管你后面是什么鬼,都会被他一律视为 有符号十进制整数来看待。

至此,谜团完全解开!美帝凭这三脚猫功夫,就想在南海耍阴谋阳谋,夺我南海霸我岛礁,没门!当然,在这风声鹤唳,草木皆兵的非常时期,我们必须步步为营,谨慎行事!总结一下我们学到的东西。

美国间谍卑劣题目的警醒

1、有符号数和无符号数在一起运算时,统一向无符号数转化。

2、除了面试笔试和作死,不要试图将他们放一起运算。

3、有些无力烧脑的语言(如Java)已经放弃无符号数。

4、美帝亡我之心不死,但我们不怕。好好工作好好学习,就是对国家的最大支持,其他一切都是扯淡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档