无符号数 - Wikiwand
For faster navigation, this Iframe is preloading the Wikiwand page for 无符号数.

无符号数

维基百科,自由的百科全书

本条目存在以下问题,请协助改善本条目或在讨论页针对议题发表看法。 此条目包含过多行话或专业术语,可能需要简化或提出进一步解释。 (2015年1月9日)请在讨论页中发表对于本议题的看法,并移除或解释本条目中的行话。 此条目需要精通或熟悉相关主题的编者参与及协助编辑。 (2015年1月9日)请邀请适合的人士改善本条目。更多的细节与详情请参见讨论页。 此条目没有列出任何参考或来源。 (2015年1月9日)维基百科所有的内容都应该可供查证。请协助添加来自可靠来源的引用以改善这篇条目。无法查证的内容可能被提出异议而移除。

无符号数(unsigned)是计算机编程中的一种数值资料型别。有符号数(signed)可以表示特定类型规定范围内的整数(包括负数),而无符号数只能表示非负数(0及正数)。

有符号数能够表示负数的代价是能够表示的正数范围的缩小,因为其约一半的数值范围要用来表示负数(如8位有符号整数中,对应8位无符号整数表示128~255的部分被用于表示-127~-1)。无符号数可以利用其所占有的所有来表示较大的数。

例如,16位有符号整数可表示-32768~32767之间的任意整数,而16位无符号整数可表示0~65535之间的数。若将有符号数转换为二进制,则其数值类型允许的最左一位用于表示符号(1为负数,0为正数和0),但在无符号数中,最左一位与其右各位一样用于表示数值。

大多数架构机器语言不区分有符号数及无符号数。然而算术指令通常设定进位标志等CPU标志,为无符号算术及溢出标志设定。这些标志能够被带入随后的分支及算术指令中。

C语言及大部分C的派生语言为其所有有符号数类型及char类型提供了对应的无符号类型。在这些语言中,若存在显式的unsigned标识符,则将此数标识为无符号,否则为有符号(char类型除外),对应地存在signed标识符用于标识有符号数。为数值添加U后缀也可将此数值标识为无符号数。例如,在32位数中,0xFFFFFFFF表示-1,但0xFFFFFFFFU表示4294967295。

编译器在遇到有符号数与无符号数间的比较、算术等操作时常会发出警告,因为可能因其范围不同而导致溢出。C/C++语言规定无符号整数运算不存在溢出,如果结果超出了无符号类型能表示的最大数,则做模运算取余数。[1]例如,对于uint32的 2-3, 其结果对0x10000模运算取余数,最终结果为0xFFFF。

  1. ^ ISO/IEC 9899:1999 (E) §6.2.5/9:[...] A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.
{{bottomLinkPreText}} {{bottomLinkText}}
无符号数
Listen to this article