關于補碼的一些認識:
1.強制類型轉(zhuǎn)換不改變參數(shù)在計算機中的表示,位的表示沒有改變,改變的只是如何將這些位解釋成數(shù)據(jù)。。
看看下面的代碼:
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);
|
逐個驗證,都是成立的,注意對于最后一個,不是強制類型轉(zhuǎn)換,而是取相反數(shù),這個當然是要變的,補碼,取反加1. OK
2.先看看這個誤區(qū)。對于:
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] << " ";
}
|
為何輸出的內(nèi)容是:
78563412
x V 4
請按任意鍵繼續(xù). . .
|
X ----- “78”
printf("%x",'x');
輸出即為78.
為何前者輸出的是正確的結(jié)果而后者不是呢?很簡單,前者格式化輸出為2位的16進制數(shù),而后者則認為它是字符,因為是char*類型。看了C++和C的不同也在于此啊。(追問:那么C++中的表示呢?)該語句中,即使是hex,還是輸出來的是的是ASCII對應的字符。。。(查查hex等的具體用法)
3.小端法表示:
//該函數(shù)模板實現(xiàn)了將某類型的變量各位輸出來看看。。
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
請按任意鍵繼續(xù). . .
|
上面這個代碼就是將第一個類型的單元輸出來看看。注意,我這里用到的這個模板函數(shù)很好,通過它我可以知道任何類型的變量。顯然pnum[0]是一個char類型的。而看看里面的部分,哈哈,剛好就是7和8對應的二進制表示了。。。所以說:計算機可以尋址的最小單位是一個字節(jié)。而這個字節(jié)的內(nèi)部,它是無法得到的,更是無法改變的,intel機都是用的小端法表示的,所以地位的78顯示在前面,但是表示78的內(nèi)部的二進制位,卻沒有按照這個來,注意,前面所說的。。
4.關于unsigned和signed的幾點說明:
前面說過,表示是不變的??墒侨绻袷交敵龅臅r候要注意形式。
先看看下面的代碼:
#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
請按任意鍵繼續(xù). . .
|
%d和 %u表示不同的輸出格式,前者是有符號的,后者是無符號的。如果類型不一致,那么會按照這個格式來轉(zhuǎn)換的,比如一個unsigned的類型,那么用%d就會自動轉(zhuǎn)換成有符號的。。特別注意。
//用這個函數(shù)模板來實現(xiàn)輸出各位。。。
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 閱讀(405)
評論(0) 編輯 收藏 引用 所屬分類:
深入理解計算機系統(tǒng)