在大多数编程语言中,整数数据类型的有限范围内总是会有一个负数比正数大。数字原始数据类型
例如,在C中,一个字节是-128〜127,int是-2^31和2^31-1之间的整数。 有没有原因为什么一个字节不是-127〜128,因为在直观意义上,正数的出现更频繁?
在大多数编程语言中,整数数据类型的有限范围内总是会有一个负数比正数大。数字原始数据类型
例如,在C中,一个字节是-128〜127,int是-2^31和2^31-1之间的整数。 有没有原因为什么一个字节不是-127〜128,因为在直观意义上,正数的出现更频繁?
最大的正时0111 1111 = 127
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
最大负字节是1000 0000 = - 128
-128| 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
在二进制的MSB(最高有效位 - 前一个)是保留以表示负数。这个概念被称为Twos' Complement,被大多数计算机用作以二进制(基数2)表示法表示整数的一种方式。
为了获得更多的信息查找到二进制计算
+1关键字:二进制补码。 – delnan
@delnan谢谢!加了一点:) –
@delnam - 我不记得了,C标准是否需要两个人的赞美,还是仅仅是最常见的?不是任何人实际上*使用*的赞美了。 –
这是因为2的补码表示法。符号位为0表示正数,1表示负数。因此,使用4位作为一个简单的例子:
阳性:0为0000,1是0001,等等,直到作为0111 7.
阴性:-1是1111,-2是1110,等等,降至1000为-8。
(我知道这并不能回答你的问题,但它确实解决你的问题一个不真实的假设,这是太长留下的评论。)
事实上,C标准不不定义一个字节的大小。
唯一确定的是char
将能够保存一个字符。
过去,取决于CPU,字节的取值范围为5到9位。
确实,大部分野性已经稳定下来,大部分系统都使用8位字节。
// What the C standard says must be true:
sizeof char <= sizeof int <= sizeof long
这就是为什么许多预C99(和C99)系统包含的非常有用的typedef:
int8
uint8
int16
uint16
int32
uint32
如果我们要迂腐:(1)但是,C标准确实为您列出的类型定义了*最小*范围。 (2)固定大小的整数类型*已经在C99中被标准化,稍后将被标准化。 (3)也有(非古代)嵌入式系统的报告,其中“字节”是几个八位字节大。 – delnan
@delnan - 感谢那里的负责人。到C99开始流行时,我已经没有大部分的C开发了。就迂腐而言,罪名成立。在我的辩护中,C是一种迂腐的语言。已知C开发人员最终在低层领域工作,因此应该更加小心“一刀切”的思维模式。 –
在整体的数据类型具有有限的范围内大多数编程语言,总是有负数比正数多一个。
这是因为2的补码几乎总是被使用。
二补的原因如此受欢迎基本上归结为硬件原因。特别是:
a - b = a + (~b + 1)
例(4位字):
0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001
(注意,除了步骤基本上无符号的另外 - 有符号位的任何特殊处理这些步骤)
基本上,在hardware-land中,您可以将a - b
更改为a + ~b + 1
,并将初始进位设置为1.这可能是一个非常有用的技巧。减法不需要特别小心,这意味着它不需要自己的电路。
请注意,有多少*非负*整数是负数。不要忘记0! – delnan