首先我們知道,short型在計算機中儲存時占用了16個bit,int型占用了32個bit,題目要求的都是有符號數
因此short:0–14位是數值位,15位是符號位;int:0–30位是數值位,31位是符號位
從short到int,我們需要將short中的0-14位存入int型的0–14位,同時將符號位傳到對應位置。
int
short2int
(short a)
我們思考用指標來完成這個操作,首先在函式體內定義乙個同樣的short型整數x和short型指標px;
同時定義好接收的int型變數y和指標py,py指向變數y
接下來我們寫到的
px=
(short
*)py;
這一步是對指標的型別轉換,我們知道指標的本質是儲存位址,所以不同型別的指標都是在儲存位址,區別就是
指標在記憶體中每次移動的位元組數,例如int型別佔4個位元組,指標就從首位址開始移動,讀取4個位元組,short型別佔2位元組,指標就移動2位元組。通過宣告指標型別,告訴指標每次移動多少位元組,來獲取變數的值。
因此指標型別就限制了指標讀取位元組的步長,我們在這裡將py轉換為int型變數,這樣的話,(py+1)對應的操作就是向後移四個位元組讀取而不再是兩個位元組。
經過這步操作之後,px和py一樣是short型指標,同樣指向變數y,再通過解引用操作,將x的值賦給指標所存位址所存內容。
接下來我們要將符號位進行傳遞,通過位運算,如果short的符號位是1,那麼y保持低十六位不變,高十六位或1,同步符號位,完成操作。
大端模式(big-endian):
所謂的大端模式,是指資料的高位元組,儲存在記憶體的低位址中,而資料的低位元組,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;
例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)
記憶方法: 位址的增長順序與值的增長順序相反
小端模式(little-endian):
所謂的小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致
例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)
記憶方法: 位址的增長順序與值的增長順序相同
我的計算機是小端模式
首先給出**
int
int_short
(const
int x,
short
* py)
//int->short
定義short型指標px,指向了int型資料,由於它是short型,步長為int的一半,因此px指標指向的資料就是x的低16位。
在這裡我們要判斷能否轉換,因此我們要看int型資料的15-30位是否有資料,一旦存在就超出了short的儲存範圍,將無法轉換。
我們在這裡用x0得到高15-30位,再與0進行比較,最後再對符號做調整,利用指標的解引用,給short型指標賦值。
int與short之間的轉換
寫的乙個int轉short的類 前些時間做藍芽.標準的藍芽類沒法建資料流,後來就出現了只能傳送byte可是我們的程式中資料型別有很多,所以必要做轉化.這裡做了個int轉short的方法.public classtest system.out.println true public static sh...
int與short的賦值的坑
include using namespace std void main 執行結果 a 2147418113 b 1請按任意鍵繼續.對於上面的賦值語句,首先了解一些規則 一 數字多的往數字少的轉化 截斷 即只取低n位 正如上例 short 型 b 擷取 int 型 a 的低16位 相當於b 0x0...
計組實驗 cpu與記憶體的訪問(物件導向思想實現)
實驗目的 掌握cpu對儲存器進行訪問的基本操作步驟 了解用軟體模擬計算機硬體結構的基本方法 了解物件導向設計方法在軟體開發活動中的應用。實驗任務 用c 程式語言和物件導向程式設計方法,編寫程式,模擬實現cpu按位址對主存進行讀寫操作的過程。程式功能 採用物件導向程式設計方法,編寫c 程式,模擬cpu...