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類及檔案流類(ofstream,ifstream)的基本操作---按行讀取文件
先說明一個問題: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:圖像二值化、互補圖(反運算)(im2bw,imcomplement函數)
idt 部分 轉換成 灰度 技術 ice 工作 圖像 light 圖像二值化、反運算過程涉及到im2bw,imcomplement函數,反運算可以這麽理解:原本黑的區域變為白的區域,白的區域變為黑的區域。 實現過程如下: close all; %關閉當前