Sam*_*152 61 language-agnostic variables unsigned
我已经在C和C++的上下文中看到了这些,但有符号和无符号变量之间有什么区别?
小智 41
虽然通常称为"符号位",但我们通常使用的二进制值没有真正的符号位.
大多数计算机使用二进制补码算法.通过取一个补码(翻转所有位)并添加一个来创建负数:
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,但我现在找不到任何参考.