Welcome

首页 / 软件开发 / 汇编语言 / 计算机系统原理(八) C语言的有符号与无符号、二进制整数的扩展与截断

计算机系统原理(八) C语言的有符号与无符号、二进制整数的扩展与截断2014-08-22开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完。主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿的实力还是有着很大的潜在提高的。

只是这种原理性的文章写起来相对复杂与繁琐,较对起来也比较困难,因为文章里充斥着各种各样的数学符号,不过相对于这样的写作难度来说,其受欢迎程度,却远远比不上一些难度较低的杂文。这一点从LZ的博客就能很明显的看出,LZ博客排名前几的文章,几乎全部都是LZ写的一些杂谈,比如经历、建议、感悟等等这一类的。

不过LZ也很理解这种现象,毕竟杂文看起来不怎么需要动脑子,内容相对来说也比较有趣,而且说不定偶尔也能有意外的大收获,受欢迎自是无可厚非的。不过对于计算机系统原理这种文章来说,倘若各位猿友能够坚持看下去的话,应该是会有不少的收获的。

此外LZ也希望各位猿友在观看之余,也不妨给予LZ一些鼓励和支持,这样不仅LZ的动力会大大增加,也会由于猿友们的鼓励而产生更大的责任感,从而更加费心的将内容更简单的解释清楚。

废话就到此结束吧,再写下去的话估计有猿友要忍不住吐槽LZ废话连篇了。就此打住,其实说了这么多,LZ就是想说五个字,“点个推荐吧。”

引言

在上一章中,我们着重介绍了整数的表示方式,也就是无符号编码和补码编码。本次我们来看一下二进制整数的扩展与截断,这部分内容是与C语言挂钩介绍的。因此我们首先来简单的看一下C语言的有符号数和无符号数。

C语言中的有符号数和无符号数

有符号数和无符号数的本质区别其实就是采用的编码不同,前者采用补码编码,后者采用无符号编码。

在C语言中,有符号数和无符号数是可以隐式转换的,不需要手动实施强制类型转换。不过也正是因为如此,可能你不小心将一个无符号数赋给了有符号数,就会造成出乎意料的结果,就像下面这样。

#include <stdio.h>int main(){short i = -12345;unsigned short u = i;printf("%d %d
",i,u);}
结果如下。

一个不小心,一个负数就变成正数了,再看下面这个程序,它展示了在进行关系运算时,由于有符号数和无符号数的隐式转换所导致的违背常规的结果。

#include <stdio.h>int main(){printf("%d
",-1 < 0U);printf("%d
",-12345 < 12345U);}
结果如下。

可以看到,两个结果都为0,也就是false,这与我们直观的理解是违背的,原因就是因为在比较的过程中,有符号数被隐式的转换成了无符号数进行比较。