将无符号变量分配给有符号值有什么用处?

时间:2012-06-20 15:33:09

标签: c unsigned signed

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

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

为什么这样做?我总是试图在使用signed / unsigned时保持一致,因为我知道在两者之间切换可能会导致问题,但是这个开发人员似乎并不关心。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

例如,它们可能是UTF-8字符串,它们由无符号字节组成,可能需要手动处理,但是它们可以安全地传递给printf,而printf在许多平台上都需要签名字符,所以你必须这样做在某个地方施展以避免警告。

答案 2 :(得分:0)

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

通常,在使用使用不同编码样式的第三方代码或对char的签名做出不同假设时,示例中的强制类型用于关闭“指针符号”警告。在这种情况下并不总是能保持一致,但是为了改变字符串指针的符号而进行转换不太可能导致任何问题。

答案 3 :(得分:0)

对于指针而言无关紧要,只要有符号和无符号字符在内存中的大小相同,这就是地址。而unsigned char *对于一个任意的内存地址最有意义 - 这就是为什么大多数纯粹的内存函数都把它当作一个arguemnt

答案 4 :(得分:0)

C语言没有指定char的签名,因为字符本质上不是带符号的值,并且当C标准化时,某些实现将它们视为已签名而有些则没有。因此,将char转换为signed charunsigned char始终是安全的。前者不常见,但后者是为了使用char作为数组索引或ctype.h is...to...函数的参数。但是,如果没有看到任何使用unsigned char*指针的实际代码,就无法确定它为何被使用。