天天看点

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

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

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

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