[英]cast 'char *' to 'signed char *'
在C中將char *
類型轉換為signed char *
是否存在任何危險,其中char數組被解釋為字節數組。
我在gcc中讀過, char
類型可以是無符號的,也可以是簽名的,具體取決於系統。 在'最壞'的情況下, char *
將是一個unsigned char *
,但由於該數組只被解釋為一系列位,因此類型從無符號到有符號無關緊要。
(順便說一句,我已經檢查了其他帖子,但我只看到了問題:將unsigned char
為signed char
,我想知道是否有任何特殊的純粹char
。請提前感謝。)
轉換本身應該沒有任何問題,特別是如果你只是將數組解釋為字節。 在這種情況下,雖然我建議您考慮使用C99類型uint8_t
和int8_t
來更好地傳達您的意圖,如果它們可供您使用。
沒有危險,它明確允許在所有三種char類型中重新解釋char
指針,並且還將任何對象指針重新解釋為char指針(因此將任何對象視為字節數組)。
在分配后有一些邊緣情況進行比較,但是對於存儲和處理不同的功能,沒有任何危險......
在您的實現中,默認情況下char可能是簽名或未簽名的...
比較和簽名問題的示例:
在MacOS X上使用c99中的clang
char * dog = malloc(1);
dog[0]= 0xff;
unsigned char * mansBestFriend = dog;
if (mansBestFriend[0] > dog[0]) {
puts("boy that is strange");
}
輸出:奇怪的男孩
由於C中有時令人困惑的比較規則,比較的方式可能看起來很奇怪。
還有很多其他時候會發生這種情況,而我永遠無法記住的是其中一個值比另一個大,一個是簽名而另一個不是......的情況。如果您正在對不同類型進行比較,那么要明確。
不,這樣做沒有危險,因為您只想將其用作字節值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.