【发布时间】:2010-09-16 11:00:39
【问题描述】:
谁能给我解释一下:
char* a;
unsigned char* b;
b = a;
// error: invalid conversion from ‘char*’ to ‘unsigned char*’
b = static_cast<unsigned char*>(a);
// error: invalid static_cast from type ‘char*’ to type ‘unsigned char*’
b = static_cast<unsigned char*>(static_cast<void*>(a));
// everything is fine
演员表 2 和演员表 3 的区别是什么?如果将 3 中的方法用于其他(更复杂的)类型,是否有任何陷阱?
[编辑] 正如一些人提到的糟糕的设计等......
这个简单的例子来自一个图像库,它给了我指向图像数据的指针char*。显然图像强度总是正的,所以我需要将其解释为 unsigned char 数据。
【问题讨论】:
-
我不同意你的编辑声明。如果给定一个 char 数组,那么它就是一个 char 数组。类型很强大,真的是在 C++ 中,而你正在做 C 杂技。而且大多数时候大多数时候编译器告诉你错了,那么你就错了。
-
如果在某个时刻你真的需要 unsigned char,你可以简单地这样做,但在你真正需要的非常精确的时刻:
int i = 65; unsigned int j = i;这将编译,因为它是合法的,你总是可以合法地存储一个无符号字符中的字符。 -
好吧,如果另一个库需要正确的
unsigned char*:D 怎么办。你会写一个循环并将所有值复制到一个新数组吗? -
是的,在这种情况下,我理解,并且我同意你的看法,最好重新解释广播。但我不同意你的“正确”一词。如果强度值在 0 到 127 之间,显然是这样,那么 char 和 unsigned char 类型都是正确的。