我已经在C和C++的上下文中看到了这些,但有符号和无符号变量之间有什么区别?
有符号变量(如有符号整数)将允许您表示正数和负数范围内的数字.
无符号变量(例如无符号整数)只允许您以正数表示数字.
相同类型(例如int
和byte
)的无符号和有符号变量都具有相同的范围(范围分别为65,536和256个数字),但无符号可以表示比相应的有符号变量更大的幅度数.
例如,a unsigned byte
可以表示来自0
to的值255
,而signed byte
可以表示-128
to 127
.
签名数字表示的维基百科页面解释了位级别表示的差异,整数(计算机科学)页面提供了每个有符号/无符号整数类型的范围表.
虽然通常称为"符号位",但我们通常使用的二进制值没有真正的符号位.
大多数计算机使用二进制补码算法.通过取一个补码(翻转所有位)并添加一个来创建负数:
5 (decimal) -> 00000101 (binary)
1's complement: 11111010
add 1: 11111011 which is 'FB' in hex
这就是有符号字节保存-128到+127而不是-127到+127的值的原因:
1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(添加1到127给:)
1 0 0 0 0 0 0 0
我们在这个图表的顶部看到的是-128.
如果我们有一个正确的符号位,则值范围将是相同的(例如,-127到+127),因为为该符号保留了一个位.如果最重要的位是符号位,我们将:
5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)
在这种情况下有趣的是我们有零和负零:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)
我们没有-0和二进制补码; 什么是-0是-128(或更一般,比最大正值多一个).虽然我们做一个人的补充; 所有1位均为负0.
在数学上,-0等于0.我依稀记得一台计算机,其中-0 <0,但我现在找不到任何参考.
有符号变量使用一位来标记它们是正还是负.无符号变量没有这个位,这样他们就可以存储在同一个空间较大的数字,但只为非负数,如0高.
更多信息:无符号和有符号整数