在C中将char *
类型转换为signed char *
是否有任何危险,其中char数组被解释为字节数组。
我已经在gcc中看到,char
类型可以是无符号的,也可以是签名的,具体取决于系统。在“最差”情况下,char *
将是unsigned char *
,但由于数组只是被解释为一系列位,因此类型从无符号变为有符号无关紧要。 / p>
(顺便说一句,我已经检查了其他帖子,但我只看到了问题:将unsigned char
投射到signed char
,我想知道是否有任何独特的内容{{1}提前谢谢。)
答案 0 :(得分:4)
转换本身应该没有任何问题,特别是如果你只是将数组解释为字节。在这种情况下,虽然我建议您考虑使用C99类型uint8_t
和int8_t
来更好地传达您的意图,如果它们可供您使用。
答案 1 :(得分:2)
没有危险,明确允许在所有三种char类型中重新解释char
指针,并将任何对象指针重新解释为char指针(从而将任何对象视为数组)字节)。
答案 2 :(得分:1)
有一些边缘情况在分配后进行比较,但是对于存储和处理不同的功能,没有任何危险......
同样在你的实现中,默认情况下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中的比较规则有时会令人困惑,因此比较可能看起来很奇怪。
还有很多其他时候会发生这种情况,而那些我永远无法记住的情况是其中一个值比另一个大,一个是签名而另一个不是......它是如果你正在对不同类型进行比较,那么最好去投票。
答案 3 :(得分:1)
不,这样做没有危险,因为你只想将它用作字节值。