c++中按位取反運算

http://blog.csdn.net/gukesdo/article/details/6998260
html]
view plaincopy
  1. #include <stdio.h>  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void main()  
  7. {  
  8.       
  9.     //做這類題目抓住兩點:第一、無論是以進製表示還是整數形式賦值給變量,都要根據變量相應  
  10.     //的數據類型,表示爲補碼的形式存儲進計算機內存中;第二、無論是在做數據類型強制轉換(  
  11.     //內存存儲形式沒有改變,這一點可以通過查看Memory得到)還是做位運算的時候,實際上都是對  
  12.     //內存中存儲的數進行的操作(也可以查看Memory得到),至於呈現的時候就是根據設定的數據類  
  13.     //型把內存中存儲的二進制數字進行相應規則的呈現即可  
  14.   
  15.     //cout << sizeof(long long) << endl;  
  16.   
  17.     //注意,計算機存儲的都是數的補碼,無論是正數還是負數,另外要注意數據類型的長度  
  18.     short int a = 0x8000;//有符號數則表示-32768(計算機就存這個數,它是補碼,要算實際代表的數要運算)  
  19.     short int b = 0x7000;//有符號數表示28672  
  20.     unsigned short int c = 0x8000;//無符號數則表示32768,是正數  
  21.   
  22.     short int d = c;  
  23.     unsigned short int e = a;  
  24.   
  25.     cout << a << endl;//應輸出-32768,因爲是有符號數  
  26.     cout << b << endl;//應輸出28762,應爲是正數  
  27.     cout << c << endl;//應輸出32768,因爲是無符號數  
  28.     cout << d << endl;//應輸出-32768,因爲強制轉換成了有符號數  
  29.     cout << e << endl;//應輸出32768,因爲強制轉換成了無符號數  
  30.     //感覺強制轉換的時候在內存存儲形式並沒有任何改變,只是呈現的形式改變而已,按照需要的數據類型格式進行呈現  
  31.     //任何的位操作都是對內存中存儲的數進行的操作。  
  32.   
  33.     short int pre = -3;                 //在內存中的表示爲1111 1111 1111 1101是它的補碼形式,即0xfffd  
  34.     unsigned short int trans = pre;     //0xfffd無符號數應表示的是65533,注意內存內形式不變  
  35.     short int m = ~pre;                 //直接操作的是內存中存儲的形式,按位取反後是0000 0000 0000 0010,即0x0002  
  36.     unsigned short int n = ~pre;        //實際上之後的形式還是0x0002  
  37.   
  38.     cout << pre << endl;  
  39.     cout << trans << endl;  
  40.     cout << m << endl;  
  41.     cout << n << endl;  
  42.   
  43.     cout << "/*********************************************************************************/" << endl;  
  44.     unsigned char ch = 'F';  
  45.     //其實下面一行代碼做了三步操作  
  46.     //第一、首先把ch按位取反,之後在內存中的形式變爲1011 1001  
  47.     //第二、把內存中的這個值先進行擴位,擴充成short類型的,擴位的時候是看做有符號數進行的,  
  48.     //擴位之後爲1111 1111 1011 1001,即:0xffb9  
  49.     //第三、把0xffb9按照無符號數規則進行呈現  
  50.     unsigned short int p = ~ch;  
  51.     unsigned short int q = (unsigned)~ch;  
  52.   
  53.     cout << ch << endl;  
  54.     cout << p << endl;  
  55.     cout << q << endl;  
  56.   
  57.     cout << "/**************************************************************************/" << endl;  
  58.     unsigned short int p1;  
  59.     short int p2;  
  60.       
  61.     //有符號字符擴充爲無符號和有符號short int  
  62.     char ch1 = 'F';  
  63.     p1 = ~ch1;  
  64.     p2 = ~ch1;  
  65.     cout << p1 << endl;  
  66.     cout << p2 << endl;  
  67.   
  68.     //無符號字符擴充爲無符號和有符號short int  
  69.     unsigned char ch2 = 'F';  
  70.     p1 = ~ch2;  
  71.     p2 = ~ch2;  
  72.     cout << p1 << endl;  
  73.     cout << p2 << endl;  
  74.   
  75.   
  76.     /******測試有符號數和無符號數的強制轉換和擴位******/  
  77.     cout << "/**************************************************************************/" << endl;  
  78.     int nn = 0;  
  79.     unsigned int nn1 = 0;  
  80.   
  81.     //無符號數(正)擴充爲有符號數和無符號數  
  82.     unsigned short int mm1 = 0x7000;  //28672  
  83.     nn = ~mm1;  
  84.     nn1 = ~mm1;  
  85.   
  86.     cout << nn << endl;   
  87.     cout << nn1 << endl;   
  88.   
  89.     short int aaa = 0x8000;  
  90.     long long bbb = ~aaa;  
  91.   
  92.     //無符號數(負)擴充爲有符號數和無符號數  
  93.     unsigned short int mm3 = 0x8000;   //32768  
  94.     nn = mm3;  
  95.     nn1 = mm3;  
  96.   
  97.     cout << nn << endl;  
  98.     cout << nn1 << endl;  
  99.   
  100.     //有符號數(正)擴充爲有符號數和無符號數  
  101.     short int mm2 = 0x7000;             //+28672  
  102.     nn = mm2;  
  103.     nn1 = mm2;  
  104.   
  105.     cout << nn << endl;  
  106.     cout << nn1  << endl;  
  107.   
  108.     //有符號數(負)擴充爲有符號數和無符號數  
  109.     short int mm4 = 0x8000;             //-32768  
  110.     nn = mm4;  
  111.     nn1 = mm4;  
  112.   
  113.     cout << nn << endl;  
  114.     cout << nn1  << endl;  
  115.   

發佈了4 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章