后面作者會在2025.5.25 00:00前整理出筆記和思維導圖大家放心,主頁還有其他文章 請先移步歡迎參考 收藏文章 關注博主 高效學習
好了,這小節我們要探討一個相對來說簡單的問題,就是C語言里邊的那些定點整數是如何進行強制類型轉換的。好來看這樣的一個例子,首先需要跟大家聲明的是C語言當中的定點整數。
大家熟悉的什么int?啊,還有什么short還有long這些定點整數都是用補碼的形式來存儲的。另外C語言里還有一個關鍵字叫unsigned,如果用unsigned來修飾short或者int或者long。
那就意味著這個定點整數它是一個無符號數。好來看一下,現在有一個short型的短整數x,它的值是負的四三二一,那么由于是采用補碼表示的。
并且短整形是占兩個字節,也就是。16個比特,所以16個比特的補碼表示負四三二一應該是這樣的一個值,這個大家可以自己轉換一下。
源碼補碼如何轉換?這個我們之前已經強調過,不熟悉的同學可以再自己動手試一下好,現在我們。把x這個呃短整形的數。
把它強制轉換成unsigned short,也就是無符號的短整形。y那這種強制轉換的規則是會把x的這個補碼形式的數。完整不變的復制給y這個變量,那由于y也是占兩個字節。
所以y的機器代碼其實和x是一模一樣的。只不過由于y是一個無符號的短整形,因此計算機在解析y的真值的時候,會按照無符號整數來進行解析。所以這個二進制無符號數。
把轉換成真值,應該是對應這樣的一個值,同樣的,大家可以暫停來轉換一下,看看是不是這樣?
好,那這是一個有符號的定點整數轉換成長度相同的無符號定點整數的一個規則。不改變數據的二進制內容,但是會改變它的解釋方式。好。
再看第二個例子,如果我們把一個更長的數據把它變成一個更短的數據啊,這兒我們定義了兩個int型的變量a和b。那大多數情況下C語言里邊int型的數據占四個字節。那現在a和b是兩個有符號的數都用補碼的形式來保存。
當我們把a和b這兩個數強制轉換成short,也就是由四個字節變成兩個字節的時候。計算機的做法是會直接把高位截斷,然后只保留低位,那a對應的16進制應該是這樣的。
把這四個字節的內容截斷,只保留最低兩個字節的內容,也就是八六a一那更低的兩個字節,就是c這個變量的值。那由于c是一個有符號的短整形。
所以計算機會用補碼的規則來對它進行解析,與之對應的真值就應該是這樣的一個值。這是一個16比特,16位的布嗎?那對于b和d也是一樣的b這個數呃。
它用補碼表示應該是這樣的,把b轉換成只有兩個字節的d呃short類型,那么就是只保留。更低的兩個字節,七七五幺。
那同樣的,由于d它是一個有符號的短整形,所以計算機會用16比特補碼的這種方式來對它進行解析,與之對應的真值是這樣的一個值。好。
那這是更長的數據轉換成更短的數據的一個處理方式,很殘暴,就是直接截斷,只保留更低的字節。好。
最后再來看更短的數據,轉換成更長的數據,那這個問題其實我們之前聊過,也就是所謂符號擴展的問題。好x原本是一個兩個字節的補碼呃。
總共占16位,那么把short型的x轉換成四字節的int型。計算機做的事情就是符號擴展,那之前我們說過,對于一個定點整數的補碼來說。
如果它是一個負數。那么,我們需要在高位呃,也就是這個符號位和原有的數值位之間添一用,這樣的方式擴展得到的補碼。
你把它解析為真值的話,這個真值是不會變的。只不過是補碼的整體長度拓展了而已,好再來看n這個變量呃,我們把x強制的轉換為無符號類型。
然后把它復制給無符號的短整型n。那之前我們說過,這種強制轉換會把二進制代碼原封不動的復制給n,只不過計算機會以無符號數的規則來解析這一串機器數。那這是n所對應的一個真值好。
最后把無符號數n變成四個字節的無符號數p。那由于是無符號數到無符號數的轉變,因此直接在高位添零就可以。p和n的真值,這個真值是保持不變的。
好,那這就是C語言里邊定點整數相關的一些強制類型轉換第一個部分,探討的是在轉換的兩種數據長度相同的情況下呃,無符號數和有符號數之間的一種轉換規則。第二個部分探討的是從長數據強轉成短數據的一個處理方式。
而第三個部分探討的是從短數據轉為長數據的一個轉變方式。