2016-01-23 95 views
1

我有int * alen類型的變量。試圖將它傳遞給函數:它是否有可能會將int *轉換爲unsigned int *

typedef int(__stdcall *Tfnc)(
    unsigned int *alen 
    ); 

與鑄造

(*Tfnc)((unsigned int *)alen) 

我能想到的情況下,價值問題從來都不是負的?

+1

如果該值是從不爲負你爲什麼不使用'unsigned'首先 –

+3

如果該值不能爲負,無論如何,爲什麼不使用'無符號int'的樣子嗎?除了提供更好的類型安全性之外,它還會更易於閱讀,理解和維護,併爲您提供更大的範圍。 –

+0

只要使用assert(),你就不必抱歉。 –

回答

3

根據C++標準,你在做什麼是不確定的行爲。就我所知,無符號和有符號整數的內存佈局不保證是兼容的。

在大多數平臺上(使用2的補整數),這將不會是一個問題。

剩下的問題是嚴格別名,這裏的編譯器就可以推測指向一個類型,以及在其他類型不是指針,以同樣的事情。

typedef int(__stdcall *Tfnc)(
    unsigned int *alen 
); 

int test() { 
    int x = 3; 
    Tfnc pf = [](unsigned int* bob) { *bob = 2; }; 
    pf((unsigned int*)&x); 
    return x; 
} 

上述代碼威力被允許,而它是通過unsigned int*改性忽略修改到x,即使在二進制補硬件。

也就是說未定義行爲的代價。

0

不,它不會有任何問題的,直到除非你傳遞的int值不爲負。 但是,如果給定值爲負,則結果值是與源整數相等的最小無符號整數(模2^n,其中n是用於表示無符號類型的位數)。

相關問題