我有int * alen類型的變量。試圖將它傳遞給函數:它是否有可能會將int *轉換爲unsigned int *
typedef int(__stdcall *Tfnc)(
unsigned int *alen
);
與鑄造
(*Tfnc)((unsigned int *)alen)
我能想到的情況下,價值問題從來都不是負的?
我有int * alen類型的變量。試圖將它傳遞給函數:它是否有可能會將int *轉換爲unsigned int *
typedef int(__stdcall *Tfnc)(
unsigned int *alen
);
與鑄造
(*Tfnc)((unsigned int *)alen)
我能想到的情況下,價值問題從來都不是負的?
根據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
,即使在二進制補硬件。
也就是說未定義行爲的代價。
不,它不會有任何問題的,直到除非你傳遞的int值不爲負。 但是,如果給定值爲負,則結果值是與源整數相等的最小無符號整數(模2^n,其中n是用於表示無符號類型的位數)。
如果該值是從不爲負你爲什麼不使用'unsigned'首先 –
如果該值不能爲負,無論如何,爲什麼不使用'無符號int'的樣子嗎?除了提供更好的類型安全性之外,它還會更易於閱讀,理解和維護,併爲您提供更大的範圍。 –
只要使用assert(),你就不必抱歉。 –