0

我正在查看的这段代码有很多地方我看到这样的事情发生:

char *functionName(char *passedVariable)
{
    unsigned char *newVariable = (char* ) passedVariable;

为什么要这样做?我总是尽量在有符号/无符号的使用上保持一致,因为我知道在两者之间切换会导致问题,但是这个开发者似乎并不在意。

4

5 回答 5

1

更改指针类型并不是真正的问题,此地址仍然有效。但是,当且仅当……有符号数据为负时,将指向的数据解释为有符号/无符号会有所不同。所以在你的例子中,如果你char的总是积极的,那么没关系,否则不是。

有符号/无符号转换示例:

char c = 42;
char d = -42;
unsigned char cu = c;
unsigned char du = d;

printf("c  %d\n", c);
printf("cu %d\n", cu);
printf("d  %d\n", d);
printf("du %d\n", du);

输出:

c  42
cu 42
d  -42
du 214
于 2012-06-20T15:44:16.060 回答
0

例如,它们可能是 UTF-8 字符串,它由无符号字节组成,并且可能需要手动处理,但它们可以安全地传递给 printf,在许多平台上它需要一个带符号的字符,所以你必须在某个地方转换为避免警告。

于 2012-06-20T15:37:24.413 回答
0

对于您的示例看起来像的字符串,这可能无关紧要。ASCII 值仅在 0-127 之间,这意味着它们可以毫无问题地适合有符号或无符号字符。此外,未装饰的符号char是实现定义的(因此存在signed关键字)。如果char是无符号类型,则您的示例根本不会有任何符号转换。

通常,在使用使用不同编码风格或对char. 在这种情况下,并不总是可以保持一致,但是强制转换以更改字符串指针的符号不太可能导致任何问题。

于 2012-06-20T15:37:39.917 回答
0

对于指针来说,这并不重要,只要有符号和无符号字符在内存中的大小相同,这只是地址。并且 unsigned char * 对任意内存地址最有意义——这就是为什么大多数纯内存函数将其作为参数

于 2012-06-20T15:38:38.647 回答
0

C 语言没有指定 的有符号性,因为字符本质上不是有符号值,并且当 C 标准化时,一些实现将它们视为有符号,而另char一些则没有。因此,转换charsigned charor总是安全的unsigned char。前者并不常见,但后者是为了将 char 用作数组索引或 ctype.his...to...函数的参数。但是如果没有看到任何使用unsigned char*指针的实际代码,就不可能确定为什么要使用它。

于 2012-06-20T16:18:08.040 回答