我正在看的这个代码有很多地方我看到这样的事情发生了:
char *functionName(char *passedVariable)
{
unsigned char *newVariable = (char* ) passedVariable;
为什么这样做?我总是试图在使用signed / unsigned时保持一致,因为我知道在两者之间切换可能会导致问题,但是这个开发人员似乎并不关心。
答案 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)
答案 2 :(得分:0)
对于字符串,您的示例看起来像,它可能无关紧要。 ASCII值仅为0-127,这意味着它们可以毫无问题地适应有符号或无符号字符。此外,未修饰char
的签名是实现定义的(因此存在signed
关键字)。如果char
是无符号类型,则您的示例根本不会有任何符号转换。
通常,在使用使用不同编码样式的第三方代码或对char
的签名做出不同假设时,示例中的强制类型用于关闭“指针符号”警告。在这种情况下并不总是能保持一致,但是为了改变字符串指针的符号而进行转换不太可能导致任何问题。
答案 3 :(得分:0)
对于指针而言无关紧要,只要有符号和无符号字符在内存中的大小相同,这就是地址。而unsigned char *对于一个任意的内存地址最有意义 - 这就是为什么大多数纯粹的内存函数都把它当作一个arguemnt
答案 4 :(得分:0)
C语言没有指定char
的签名,因为字符本质上不是带符号的值,并且当C标准化时,某些实现将它们视为已签名而有些则没有。因此,将char
转换为signed char
或unsigned char
始终是安全的。前者不常见,但后者是为了使用char作为数组索引或ctype.h is...
和to...
函数的参数。但是,如果没有看到任何使用unsigned char*
指针的实际代码,就无法确定它为何被使用。