2010-11-28 106 views
0

borland如何將無符號整型轉換爲short?Borland C/C++無符號整型縮寫

#include <stdio.h> 

void main() { 
    short sNum = 57000; 
    unsigned short usNum = sNum; 
    unsigned int uiNum; 

    printf("\r\nsNum = %d", sNum); 
    printf("\r\nusNum = %u", usNum); 

    //cast 1: short -> unsigned int 
    uiNum = sNum; 
    printf("\r\nuiNum = %u", uiNum); 

    //cast 2: unsigned short -> unsigned int 
    uiNum = (unsigned short)sNum; 
    printf("\r\nuiNum = %u", uiNum); 
} 

給我的輸出:

sNum = -8536 
usNum = 57000 
uiNum = 4294958760 
uiNum = 57000 

爲什麼我不中投1中得到57000:短unsigned int類型(?有沒有隱式轉換爲無符號短投給無符號整型前)?

回答

0

因爲你問到打印帶

printf("\r\nsNum = %d", sNum); 

線有符號整數。該變量被符號擴展爲int並作爲int傳遞給printf函數,該函數將該參數解釋爲int。

如果你沒有

printf("\r\nsNum = %u", sNum); 

,你會得到57000

+0

好的那一個說法,但問題是,當您使用與其他簽署變量變量,則使用的-8536值。 – harry 2010-11-28 12:31:34

+0

不,在第二種情況下,您會得到未定義的行爲,將錯誤的類型傳遞給`printf`。 (從技術上講,如果值是正數,我相信你可以傳遞`int`來代替`unsigned`,因爲表達式必須是相同的,但這裏是你傳遞的'int'(sNum的提升值`)是負數)。除非`int`和`short`具有相同的大小,否則我不認爲它可以打印57000。 – 2010-11-28 13:22:48

0

你是一個短的範圍之外投入的SNUM值。 你得到的存儲是整數-8536,其轉換爲int,然後到一個unsigned int是4294958760.

您需要任何聲明SNUM爲一個無符號短(所以它可以存儲你想要的值),或將其轉換爲int而不是unsigned int。

1

不,在隱式轉換爲unsigned int之前沒有隱式轉換爲無符號短整型。爲什麼會有?

首先,如果在這個實現中短褲是16位,57000不適合,所以你不能在短sNum中存儲57000。它會溢出,產生-8536。

在劇組2中,您首先將short(-8536)轉換爲unsigned short(57000,因爲它與-8536的位模式相同,但解釋爲無符號數),然後從unsigned short到unsigned int(57000)。

在演員1中,您直接從short(-8536)轉換爲unsigned int。

3

只有一個在你的代碼轉換:在C語言中

uiNum = (unsigned short)sNum; 

的你調用類型轉換剩下的事情由被稱爲(隱含的)轉換。轉換中沒有隱藏的中間步驟。如果你想要通過一箇中間類型,你可以通過強制轉換或賦值給這個類型的變量。

其次,該行:

short sNum = 57000; 

具有實現定義的行爲。您應該避免將(隱式或通過強制轉換)值轉換爲值不適合的簽名類型的代碼。

最後,你不應該問這樣的關於「C/C++」的問題。沒有這樣的語言,並且類型系統(即使是純整數類型)在兩種語言中有很大不同,因此根據您實際使用的語言,許多問題都會有不同的答案。

0

短具有8×2 = 16比特

INT已經8×4 = 32位

除非明確地提及作爲無符號既int和短簽名。 如果是有符號的數字,最左邊的位保存符號位。

所以在簽名的短小我們剩下16 - 1 = 15位。因此,對於任何大於此值的數字,其上限應爲2^15 32768. ,它從2^16(= 65536無符號上限或總容量上限)中扣除,並用負號存儲[這是那些恭維]

這裏65536 - 57000 = -8536因此,結果