2012-11-04 86 views
2

在大多数编程语言中,整数数据类型的有限范围内总是会有一个负数比正数大。数字原始数据类型

例如,在C中,一个字节是-128〜127,int是-2^31和2^31-1之间的整数。 有没有原因为什么一个字节不是-127〜128,因为在直观意义上,正数的出现更频繁?

+0

请注意,有多少*非负*整数是负数。不要忘记0! – delnan

回答

3

最大的正时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

+1关键字:二进制补码。 – delnan

+0

@delnan谢谢!加了一点:) –

+1

@delnam - 我不记得了,C标准是否需要两个人的赞美,还是仅仅是最常见的?不是任何人实际上*使用*的赞美了。 –

0

这是因为2的补码表示法。符号位为0表示正数,1表示负数。因此,使用4位作为一个简单的例子:

阳性:0为0000,1是0001,等等,直到作为0111 7.

阴性:-1是1111,-2是1110,等等,降至1000为-8。

0

(我知道这并不能回答你的问题,但它确实解决你的问题一个不真实的假设,这是太长留下的评论。)

事实上,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 
+0

如果我们要迂腐:(1)但是,C标准确实为您列出的类型定义了*最小*范围。 (2)固定大小的整数类型*已经在C99中被标准化,稍后将被标准化。 (3)也有(非古代)嵌入式系统的报告,其中“字节”是几个八位字节大。 – delnan

+0

@delnan - 感谢那里的负责人。到C99开始流行时,我已经没有大部分的C开发了。就迂腐而言,罪名成立。在我的辩护中,C是一种迂腐的语言。已知C开发人员最终在低层领域工作,因此应该更加小心“一刀切”的思维模式。 –

0

在整体的数据类型具有有限的范围内大多数编程语言,总是有负数比正数多一个。

这是因为2的补码几乎总是被使用。

二补的原因如此受欢迎基本上归结为硬件原因。特别是:

a - b = a + (~b + 1)

例(4位字):

0110 - 0101 = 0110 + 1010 + 1 = 0110 + 1011 = 0001(注意,除了步骤基本上无符号的另外 - 有符号位的任何特殊处理这些步骤)

基本上,在hardware-land中,您可以将a - b更改为a + ~b + 1,并将初始进位设置为1.这可能是一个非常有用的技巧。减法不需要特别小心,这意味着它不需要自己的电路。