- #include <stdio.h>
- #include <iostream>
- using namespace std;
- void main()
- {
- //做這類題目抓住兩點:第一、無論是以進製表示還是整數形式賦值給變量,都要根據變量相應
- //的數據類型,表示爲補碼的形式存儲進計算機內存中;第二、無論是在做數據類型強制轉換(
- //內存存儲形式沒有改變,這一點可以通過查看Memory得到)還是做位運算的時候,實際上都是對
- //內存中存儲的數進行的操作(也可以查看Memory得到),至於呈現的時候就是根據設定的數據類
- //型把內存中存儲的二進制數字進行相應規則的呈現即可
- //cout << sizeof(long long) << endl;
- //注意,計算機存儲的都是數的補碼,無論是正數還是負數,另外要注意數據類型的長度
- short int a = 0x8000;//有符號數則表示-32768(計算機就存這個數,它是補碼,要算實際代表的數要運算)
- short int b = 0x7000;//有符號數表示28672
- unsigned short int c = 0x8000;//無符號數則表示32768,是正數
- short int d = c;
- unsigned short int e = a;
- cout << a << endl;//應輸出-32768,因爲是有符號數
- cout << b << endl;//應輸出28762,應爲是正數
- cout << c << endl;//應輸出32768,因爲是無符號數
- cout << d << endl;//應輸出-32768,因爲強制轉換成了有符號數
- cout << e << endl;//應輸出32768,因爲強制轉換成了無符號數
- //感覺強制轉換的時候在內存存儲形式並沒有任何改變,只是呈現的形式改變而已,按照需要的數據類型格式進行呈現
- //任何的位操作都是對內存中存儲的數進行的操作。
- short int pre = -3; //在內存中的表示爲1111 1111 1111 1101是它的補碼形式,即0xfffd
- unsigned short int trans = pre; //0xfffd無符號數應表示的是65533,注意內存內形式不變
- short int m = ~pre; //直接操作的是內存中存儲的形式,按位取反後是0000 0000 0000 0010,即0x0002
- unsigned short int n = ~pre; //實際上之後的形式還是0x0002
- cout << pre << endl;
- cout << trans << endl;
- cout << m << endl;
- cout << n << endl;
- cout << "/*********************************************************************************/" << endl;
- unsigned char ch = 'F';
- //其實下面一行代碼做了三步操作
- //第一、首先把ch按位取反,之後在內存中的形式變爲1011 1001
- //第二、把內存中的這個值先進行擴位,擴充成short類型的,擴位的時候是看做有符號數進行的,
- //擴位之後爲1111 1111 1011 1001,即:0xffb9
- //第三、把0xffb9按照無符號數規則進行呈現
- unsigned short int p = ~ch;
- unsigned short int q = (unsigned)~ch;
- cout << ch << endl;
- cout << p << endl;
- cout << q << endl;
- cout << "/**************************************************************************/" << endl;
- unsigned short int p1;
- short int p2;
- //有符號字符擴充爲無符號和有符號short int
- char ch1 = 'F';
- p1 = ~ch1;
- p2 = ~ch1;
- cout << p1 << endl;
- cout << p2 << endl;
- //無符號字符擴充爲無符號和有符號short int
- unsigned char ch2 = 'F';
- p1 = ~ch2;
- p2 = ~ch2;
- cout << p1 << endl;
- cout << p2 << endl;
- /******測試有符號數和無符號數的強制轉換和擴位******/
- cout << "/**************************************************************************/" << endl;
- int nn = 0;
- unsigned int nn1 = 0;
- //無符號數(正)擴充爲有符號數和無符號數
- unsigned short int mm1 = 0x7000; //28672
- nn = ~mm1;
- nn1 = ~mm1;
- cout << nn << endl;
- cout << nn1 << endl;
- short int aaa = 0x8000;
- long long bbb = ~aaa;
- //無符號數(負)擴充爲有符號數和無符號數
- unsigned short int mm3 = 0x8000; //32768
- nn = mm3;
- nn1 = mm3;
- cout << nn << endl;
- cout << nn1 << endl;
- //有符號數(正)擴充爲有符號數和無符號數
- short int mm2 = 0x7000; //+28672
- nn = mm2;
- nn1 = mm2;
- cout << nn << endl;
- cout << nn1 << endl;
- //有符號數(負)擴充爲有符號數和無符號數
- short int mm4 = 0x8000; //-32768
- nn = mm4;
- nn1 = mm4;
- cout << nn << endl;
- cout << nn1 << endl;
- }
c++中按位取反運算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.