随笔-145  评论-173  文章-70  trackbacks-0

关于补码的一些认识:

1.强制类型转换不改变参数在计算机中的表示,位的表示没有改变,改变的只是如何将这些位解释成数据。。

看看下面的代码:

unsigned int x ;

   int y = -2;

   x = y;

   print_binary(x);

   print_binary(y);

   unsigned char a;

   char b = -2;

   a = b;

   print_binary(a);

   print_binary(b);

   short int n = 12345;

   short int mx = -n;

   print_binary(n);

   print_binary(mx);

 

逐个验证,都是成立的,注意对于最后一个,不是强制类型转换,而是取相反数,这个当然是要变的,补码,取反加1.    OK

 

2.先看看这个误区。对于:

int num = 0x12345678;

char *pnum = (char *)#

for (int j = 0; j < 4; j++ )

{

       printf("%.2x" ,pnum[j]);

}

for (int j = 0; j < 4; j++ )

{

   cout << hex << pnum[j] << " ";

}

 

为何输出的内容是:

78563412

x V 4 

请按任意键继续. . .

X ----- “78”

printf("%x",'x');

输出即为78.

为何前者输出的是正确的结果而后者不是呢?很简单,前者格式化输出为2位的16进制数,而后者则认为它是字符,因为是char*类型。看了C++C的不同也在于此啊。(追问:那么C++中的表示呢?)该语句中,即使是hex,还是输出来的是的是ASCII对应的字符。。。(查查hex等的具体用法)

 

3.小端法表示:

//该函数模板实现了将某类型的变量各位输出来看看。。

template <typename T>

void print_binary(T n)

{

   for ( int i = sizeof(n)*8 - 1; i >= 0; i-- )

   {

      cout <<(( n >> i ) & 1 ) << (i % 8 == 0 ? " " : "");

   }

   cout << endl;

}

 

 

for (int j = 0; j < 4; j++ )

   {

      printf("%.2x",pnum[j]);

      printf(" ");

   }

print_binary(pnum[0]);

 

输出:

78 56 34 12

0111 1000

请按任意键继续. . .

上面这个代码就是将第一个类型的单元输出来看看。注意,我这里用到的这个模板函数很好,通过它我可以知道任何类型的变量。显然pnum[0]是一个char类型的。而看看里面的部分,哈哈,刚好就是78对应的二进制表示了。。。所以说:计算机可以寻址的最小单位是一个字节。而这个字节的内部,它是无法得到的,更是无法改变的,intel机都是用的小端法表示的,所以地位的78显示在前面,但是表示78的内部的二进制位,却没有按照这个来,注意,前面所说的。。

 

4.关于unsignedsigned的几点说明:

前面说过,表示是不变的。可是如果格式化输出的时候要注意形式。

先看看下面的代码:

#include <iostream>

using namespace std;

 

int main()

{

   int x = -8;

   unsigned int y = x;

   printf("%d\n",x);

   printf("%d\n",y);

   printf("%u\n",x);

   printf("%u\n",y);

   int a = -12;

   int b = 8;

   printf("%d\n",a+b);

   printf("%d\n",(unsigned)a+b);

   printf("%u\n",(unsigned)a+b);

   printf("%u\n",a+b);

   int c = -1;

   printf("%d\n",c);

   printf("%u\n",c);

   printf("%u\n",(unsigned)c);

   return 0;

}

 

-8

-8

4294967288

4294967288

-4

-4

4294967292

4294967292

-1

4294967295

4294967295

请按任意键继续. . .

%d %u表示不同的输出格式,前者是有符号的,后者是无符号的。如果类型不一致,那么会按照这个格式来转换的,比如一个unsigned的类型,那么用%d就会自动转换成有符号的。。特别注意。

//用这个函数模板来实现输出各位。。。

template <class T>

void print_binary(T a)

{

   for ( int i = sizeof(T) * 8 - 1; i >= 0; i-- )

   {

      cout << (( a >> i ) & 1) << (i % 8 == 0 ? " " : "");

   }

   cout << endl;

}

 

posted on 2009-10-07 20:41 deercoder 阅读(380) 评论(0)  编辑 收藏 引用 所属分类: 深入理解计算机系统

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理