Discussion: How Integer store in Storage ?

在解释整数存储之前大家先了解下计算机中为什么要使用为什么需要八进制和十六进制表示数?

编程中,我们常用的还是10进制

比如:

int a = 100,b = 99;

不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

0000 0000 0000 0000 0110 0100

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。

用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?

2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。

...............................................

 在系统的内存中的特定位置,通常以16进制表示

看这段程序:

Code:
  1. #include <stdio.h>   
  2. int main(void)   
  3. {   
  4.     short int a, b;   
  5.     a = 0x0000;   
  6.     b = 0x0001;   
  7.     printf( "%d %d ", a, b );   
  8.     a = 0xFFFE;   
  9.     b = 0xFFFF;   
  10.     printf( "%d %d ", a, b );   
  11.     a = 0x7FFF;   
  12.     b = 0x8000;   
  13.     printf( "%d %d/n", a, b );   
  14.     return 0;   
  15. }   
  16.  

输出结果为:

0,1,-2,-1,32767,32768
也即:
0x0000 ->0
0x0001->1
0xFFFE-> -2
0xFFFF -> -1
0x7FFF->32767
0x8000->32768

其中前两个数是内存值最小的时候,中间两个数则是内存值最大的时候,最后输出的两个数是正数与负数的分界处。由此你可以清楚地看到计算机是如何储存一个整数的:计算机用0x0000到0x7FFF依次表示0到32767的数,剩下的0x8000到0xFFFF依次表示-32768到-1的数。32位有符号整数的储存方式也是类似的。稍加注意你会发现,二进制的第一位是用来表示正负号的,0表示正,1表示负。这里有一个问题:0本来既不是正数,也不是负数,但它占用了$0000的位置,因此有符号的整数类型范围中正数个数比负数少一个。对一个有符号的数进行取反运算后,最高位的变化将导致正负颠倒,并且数的绝对值会差1。也就是说,not a实际上等于-a-1。这种整数储存方式叫做“补码”。

 


原文链接: http://blog.csdn.net/crazyjixiang/article/details/6465209

你可能感兴趣的:(Discussion: How Integer store in Storage ?)