关于补码的一些认识:
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类型的。而看看里面的部分,哈哈,刚好就是7和8对应的二进制表示了。。。所以说:计算机可以寻址的最小单位是一个字节。而这个字节的内部,它是无法得到的,更是无法改变的,intel机都是用的小端法表示的,所以地位的78显示在前面,但是表示78的内部的二进制位,却没有按照这个来,注意,前面所说的。。
4.关于unsigned和signed的几点说明:
前面说过,表示是不变的。可是如果格式化输出的时候要注意形式。
先看看下面的代码:
#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 阅读(395)
评论(0) 编辑 收藏 引用 所属分类:
深入理解计算机系统