Skip to Main Content
C++程序设计:原理与实践(进阶篇)(原书第2版)
book

C++程序设计:原理与实践(进阶篇)(原书第2版)

by 本贾尼 斯特劳斯特鲁普
August 2021
Intermediate to advanced content levelIntermediate to advanced
450 pages
10h 35m
Chinese
Pearson
Content preview from C++程序设计:原理与实践(进阶篇)(原书第2版)

25.5.3 有符号数和无符号数

与大多数语言一样,C++同时支持有符号数和无符号数。无符号数在内存中的描述是很简单的:第0位表示1、第1位表示2,第2位表示4,依此类推。但是,有符号数就引出一个问题:我们如何区分正数和负数?对此,C++给了硬件设计者一定的自由选择的余地,不过几乎所有实现都使用了二进制补码表示法。最靠左的二进制位(最高有效位)被用来作为“符号位”:

如果符号位为1,就表示负数。二进制补码表示法已经成为事实上的标准方法。为了节约篇幅,我们只讨论如何在4位二进制整数中表示有符号数值:

基本思想就是:用x的位模式的补码(~x,参见25.5.1节)来表示-(x+1)的位模式。

到目前为止,我们一直在使用有符号整数(如int)。更好的程序设计原则是:

·当需要表示数值时,使用有符号数(如int)。

·当需要表示位集合时,使用无符号数(如unsigned int)。

这是一个很好的程序设计原则,但很难严格遵循,因为一些人更喜欢用无符号数进行某些算术运算,而我们有时需要用这类代码。特别是还有一些历史遗留问题,例如,在C语言历史的早期,int还是16位大小,每一位都很重要,而一个vector的大小v.size()返回的是一个无符号数。例如:

好的编译器会给出一个警告,指出存在有符号数(即i)和无符号数(即v.size())混合运算的情况。有符号数和无符号数混合运算有可能会带来灾难性的后果。例如,循环变量i可能会溢出,即,v.size()有可能比最大的有符号int值还要大。当i的值增大到有符号int所能表示的最大正数(2的幂减1,幂次等于int的二进制位数减1,如,int为16位宽度,此值为2 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

JAVASCRIPT之美|聽頂尖程式設計師闡述他們的思維

JAVASCRIPT之美|聽頂尖程式設計師闡述他們的思維

Anton Kovalyov
Go程序设计语言

Go程序设计语言

艾伦A. A.多诺万, 布莱恩W. 柯尼汉
C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普

Publisher Resources

ISBN: 9787111562528