将'char *'转换为'signed char *'

时间:2013-06-13 18:22:22

标签: c type-conversion

在C中将char *类型转换为signed char *是否有任何危险,其中char数组被解释为字节数组。

我已经在gcc中看到,char类型可以是无符号的,也可以是签名的,具体取决于系统。在“最差”情况下,char *将是unsigned char *,但由于数组只是被解释为一系列位,因此类型从无符号变为有符号无关紧要。 / p>

(顺便说一句,我已经检查了其他帖子,但我只看到了问题:将unsigned char投射到signed char,我想知道是否有任何独特的内容{{1}提前谢谢。)

4 个答案:

答案 0 :(得分:4)

转换本身应该没有任何问题,特别是如果你只是将数组解释为字节。在这种情况下,虽然我建议您考虑使用C99类型uint8_tint8_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)

不,这样做没有危险,因为你只想将它用作字节值。