将无符号变量分配给有符号值的处理是什么?

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

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

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

更改指针类型实际上不是问题,此地址仍然有效。 然而,当且仅当……签名数据为负时,将指向数据解释为有符号/无符号才有所不同。 所以在你的例子中,如果你的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 

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

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

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

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

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