1. 程式人生 > >c++中按位取反運算,型別轉換,擴位

c++中按位取反運算,型別轉換,擴位

#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;

輸出結果:

擴充時均是按有符號補1,輸出時則按相應的無符號或有符號輸出,注意:是補碼形式,若是負數如p2,則符號位不變,補碼-1再取反得原碼,計算其值。

F
65465
65465
/**************************************************************************/
65465
-71  //則符號位不變,補碼-1再取反得原碼,計算其值
Press any key to continue

 //無符號字元擴充為無符號和有符號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++運算型別轉換

#include <stdio.h> #include <iostream> using namespace std; void main() {   //做這類題目抓住兩點:第一、無論是以進製表示還是整數形式賦值給變數,都要根據變數相應  //的資

JAVA運算

按位取反是對補碼進行運算,當運算完後,再將補碼變回原碼。 這個符號為按位取反運算子。按位取反的運算規則為0變成1,1變成0. [0->1,1->0] 有這麼一個題:1.求~9的結果是什麼 解:9的二進位制數表示 0000 100

7-4計算油費型別轉換巨坑!!

7-4 計算油費 (15 分) 現在90號汽油6.95元/升、93號汽油7.44元/升、97號汽油7.93元/升。為吸引顧客,某自動加油站推出了“自助服務”和“協助服務”兩個服務等級,分別可得到5%和3%的折扣。 本題要求編寫程式,根據輸入顧客的加油量a,汽油品種b(90

Struts2學習之2(請求引數的封裝型別轉換輸入驗證自定義攔截器)

封裝請求引數 動態引數注入(請求引數,使用者輸入的) 方式一(動作類作為模型) 頁面 <form action="${pageContext.request.contextPath}/q1/login.do" method="pos

異或

spa 位運算 符號 targe 取反 span 特殊性 一個 target 位運算符:是指對二進制位從低位到高位對齊後進行運算。 1、按位與 & 二進制“與”運算規則:1&1=1 1&0=0 0&0=0 例如

運算子~以及原碼補碼知識

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。 二進位制數在記憶體中以補碼的形式儲存。 按位取反:二進位制每一位取反,0變1

C語言異或

https://blog.csdn.net/ZhaoFaxing/article/details/78905066   與運算:& 兩者都為1為1,否則為0 1&1=1,  1&0=0,  0&1=0,  0&

C語言正數和負數迴圈右移,左移把某正數的第m(從0開始)到n

問題:從鍵盤輸入一個整型數(int型),然後再輸入一個正整數m,把第一個數迴圈右移m位後輸出; int型別佔用32位。第一位為符號位,1則為負數,0為正數。 >>往右移動,右邊的丟棄,如果是正數,則左邊補0,如果是負數則補1. <<往左移動,每次移動

C語言快速計算

內部使用 證明 需要 內部 計算機 所有 假設 它的 code 先說結論 假設x為signed int,也就是說它的補碼表示中第一位表示符號(1:負;0:正),那麽~x=-(x+1) 證明 計算機內部使用補碼表示,則問題相當於求證:當x為signed int時,(~x)補=

補碼(為什麽再加一):告訴你一個其實很簡單的問題

滿足 所有 我們 進位 數字 樂意 如果 二進制 關系   首先,閱讀這篇文章的你,肯定是一個在網上已經糾結了很久的讀者,因為你查閱了所有你能查到的資料,然後他們都會很耐心的告訴你,補碼:就是按位取反,然後加一。準確無誤,毫無破綻。但是,你搜遍了所有俯拾即是而且準確無誤的答

計算機系統 二進位制原碼 補碼 碼 詳解 JAVA 二進位制運算 異或 左移 右移)

       在計算機系統中,數值一律使用補碼來表示和儲存。在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。   對於一個數, 計算機要使用一定的編碼方式進行儲存。 原碼, 反碼, 補碼是計算機儲存一個具體數字的編碼方式。   一個數在計算機中的二

Python與、或、異或、(筆記)

1. 按位與        按位與是針對二進位制數的操作,指將兩個二進位制數的每一位都進行比較,如果兩個相 應的二進位都為 1 則此位為 1,否則為 0。在本例中, 5 的二進位制表達為 101 , 3 的 二進位制表達為 11 (為補全位數進行按位操作寫作 011 ),則

Java運算子“~”

關於學習java中的按位取反(~)的問題 2013年07月16日 00:21:51 daokai1993 閱讀數:1468 標籤: 新手 之前不知道按位取反到底是怎麼計算的 百度谷歌的半天    也沒有什麼具體的計算防暑    後來自己琢磨了一會

C++string類及檔案流類(ofstreamifstream)的基本操作---行讀取文件

先說明一個問題:java構建物件只能使用new的方法,而C++則不然。 下面程式碼實現讀取test.txt檔案中的內容並顯示,同時將某一個字串輸入到檔案test1.txt中。 函式getline(ifstream& param1, string& param

與(&)或(|)異或(^)(~)左移()

基礎知識:  1. and(&)運算 (按位與)  and運算通常用於二進位制取位操作,例如一個數 and 1的結果就是取二進位制的最末位。這可以用來判斷一個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數.  相同位的兩個數字都為1,則為

Python的運算子~

按位取反運算子~很少用到,今天看《byte of Python》書中舉例,這裡學習一下,再複習一下計算機的基礎知識。 按位取反運算子,用來對一個二進位制數按位取反,即將0變1,將1變0,按理說十進位制的5(0000 0101)按位取反應該為(1111 1010)十進位制25

!和~的區別

http://blog.csdn.net/pipisorry/article/details/36517411 按位取反“~”:按位取反1變0,0變1 邏輯非“!”:邏輯取反, false變true,

正負數的~(小技巧)

取反運算與原碼,反碼,補碼息息相關 正數的按位反:+9 原碼:01001 反碼:01001 補碼:01001 (原碼1)01001——>反碼01001—–>補碼 01001—–>按位取反——>10110(變負數)—–>再位

c#利用DateTime星期等時間段

DateTime dt = DateTime.Now;  //當前時間          DateTime startWeek = dt.AddDays(1- Convert.ToInt32(dt.DayOfWeek.ToString("d")));  //本週週一    

MATLAB:圖像二值化、互補圖(運算)(im2bwimcomplement函數)

idt 部分 轉換成 灰度 技術 ice 工作 圖像 light 圖像二值化、反運算過程涉及到im2bw,imcomplement函數,反運算可以這麽理解:原本黑的區域變為白的區域,白的區域變為黑的區域。 實現過程如下: close all; %關閉當前