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