关于补码的一些认识:
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; } |