它是安全的轉換,也就是說,從unsigned char *
到signed char *
(或只是一個char *
?從無符號轉換爲帶符號的類型安全嗎?
回答
的訪問被良好定義的,你被允許通過一個指針來訪問一個目的是有符號或無符號類型對應於對象的動態類型(3.10/15)。
此外,signed char
保證沒有任何陷阱值,因此無論原始對象是什麼值,都可以安全地通過signed char
指針讀取。
當然,您可以期望通過一個指針讀取的值與通過另一個指針讀取的值不同。
編輯:關於sellibitze的評論,這是3.9.1/1說的。
char,signed char和unsigned char佔用相同的存儲量並具有相同的對齊要求(3.9);也就是說,它們具有相同的對象表示。對於字符類型,對象表示的所有位都參與值表示。對於無符號字符類型,值表示的所有可能位模式都表示數字。
所以確實看起來signed char
可能有陷阱值。好的趕上!
+1我正要寫類似的東西。關於陷阱表示的 – sellibitze 2009-10-20 07:40:04
:我認爲這個保證只適用於無符號字符。至少這是Jack Klein在這裏寫的:http://home.att.net/~jackklein/c/inttypes.html。你能否指出標準中提到的部分? – sellibitze 2009-10-20 07:52:58
該標準允許使用'char'左值讀取任何POD對象(包括無符號字符)。更多 - 它保證當你將這些'char'值寫回同一個'POD'對象時,你會收到原始值。我很難想象如何使用具有陷阱表示的'char'。有任何想法嗎? – 2009-10-20 14:18:21
轉換應該是安全的,因爲所有你正在做的是從一個類型的角色轉換到另一個,這應該只要知道你的代碼在你解引用指針時需要什麼類型的數據,因爲這兩種數據類型的數字範圍是不同的(也就是說,如果指針指向的數字原本是無符號的正數,它可能會成爲一個負數,一旦指針轉換爲帶符號的char *並將其解引用)
是的,unsigned char *和signed char *的範圍是不同的。我想問,轉換背後的原因是什麼? – Raptor 2009-10-20 03:29:12
應該問問那個問qn的人嗎?如果char *指向數據,技術上應該是安全的。 – futureelite7 2009-10-20 03:32:03
這取決於您將如何使用指針,只是將指針類型。
您可以安全地轉換的unsigned char*
爲char *
爲您呼叫將被期待從一個字符指針行爲的功能,但是,如果你的char值越過127,那麼你會得到不會是你的結果預計,所以只要確保你的無符號數組對簽名數組有效即可。
我已經看到它在幾個方面出錯,從無符號字符轉換爲signed char。
一,如果你使用它作爲一個數組的索引,該索引可能會消極。其次,如果輸入到switch語句中,可能會導致負向輸入,這通常是開關不期望的事情。
第三,它有上算術不同行爲右移
int x = ...;
char c = 128
unsigned char u = 128
c >> x;
具有不同的結果
u >> x;
因爲前者是符號擴展,而後者則不是。
第四,有符號字符會導致與無符號字符不同的點處發生下溢。
因此常見的溢出檢查,
(c + x > c)
可能比
(u + x > u)
將char轉換爲unsigned char和將char *轉換爲unsigned char *是有區別的。這個問題似乎是關於後者。 – sellibitze 2009-10-20 12:04:41
是的,但問題歸結爲unsigned char vs char,因爲指針並沒有真正添加任何問題。 – 2009-10-20 22:50:11
安全返回不同的結果,如果你只處理ASCII數據。
投射更改類型,但不影響位表示。從unsigned char轉換爲signed char不會改變該值,但會影響值的含義。
下面是一個例子:
#include <stdio.h>
int main(int args, char** argv) {
/* example 1 */
unsigned char a_unsigned_char = 192;
signed char b_signed_char = b_unsigned_char;
printf("%d, %d\n", a_signed_char, a_unsigned_char); //192, -64
/* example 2 */
unsigned char b_unsigned_char = 32;
signed char a_signed_char = a_unsigned_char;
printf("%d, %d\n", b_signed_char, b_unsigned_char); //32, 32
return 0;
}
在第一個例子,你必須具有值192,或二進制1.1億無符號的字符。轉換爲signed char後,值仍然是110000000,但恰好是-64的2s-complement表示形式。有符號數值以二進制補碼錶示形式存儲。
在第二個示例中,我們的無符號初始值(32)小於128,因此它看起來不受轉換影響。二進制表示是00100000,它在二進制補碼錶示中仍然是32。
到「安全地」從鑄無符號字符到符號的字符,保證值小於128。
我很驚訝它還沒有被提及:Boost numeric cast應該做的 - 但只對數據當然。
指針總是指針。通過將它們轉換爲不同的類型,您只會改變編譯器解析指向的數據的方式。
- 1. C++從無符號的隱式數據類型轉換爲帶符號的
- 2. 從無符號長整型轉換爲無符號整型
- 3. 類型轉換爲無符號用C
- 4. C++算術類型轉換與無符號&符號整數
- 5. C將無符號字符轉換爲無符號字符:4
- 6. MATLAB:從char數據類型轉換爲符號數據類型
- 7. C++ 11類型(有符號+無符號)?
- 8. 將HTML符號轉換爲Java符號
- 9. Clojure的類型轉換串符號
- 10. 無符號整型到帶有Python的帶符號浮點數
- 11. char *和UBYTE *之間的類型轉換*(無符號字符*)
- 12. 在C中籤名爲無符號轉換 - 它總是安全嗎?
- 13. 隱式轉換爲無符號類型的負整數
- 14. Embarcadero公司無法從「的UnicodeString」轉換爲「無符號字符*」
- 15. 轉換符號整型數無符號蒙山shell腳本
- 16. 將帶符號的13位值轉換爲帶符號的16位
- 17. 類型錯誤(不能轉換爲符號的字符串):
- 18. const無符號字符*轉換爲/從字符串或const char *
- 19. 從字符串轉換爲無符號字符*葉垃圾
- 20. 便攜式如何將-1轉換爲無符號類型?
- 21. 枚舉類「不能轉換爲無符號整型」
- 22. 將負數轉換爲無符號類型(ushort,uint或ulong)
- 23. 錯誤:從「無符號字符*」無效轉換「常量符號字符*」
- 24. 將有符號整數轉換爲無符號長整型的最佳方法?
- 25. Prolog的DCG中:從編程符號轉換爲邏輯符號
- 26. 如何從int轉換爲無符號短整型 - iPhone
- 27. 轉換無符號短於符號短爲音頻PCM樣本
- 28. 如何將無符號長符號轉換爲unsigned char *?
- 29. 將字符類型轉換爲整數類型是否安全
- 30. 帶符號分子無符號劃分
你的意思是安全嗎? – 2009-10-20 03:25:18
清理了一下這個問題,但仍不確定「安全」是什麼意思。 – 2009-10-20 03:34:53
我有一個包含ASCII碼字符的std :: string類型的std :: list,我只是需要將它們轉換爲unsigned char *來完成它們的加密。 – cpx 2009-10-20 03:49:20