这段代码我在看有很多,我看到这样的事情发生的地方:
char *functionName(char *passedVariable)
{
unsigned char *newVariable = (char* ) passedVariable;
为什么能这样做? 我总是尽量在使用符号/无符号一致的,因为我知道,这两者之间的切换可能会造成问题,但是这似乎开发商并不关心。
这段代码我在看有很多,我看到这样的事情发生的地方:
char *functionName(char *passedVariable)
{
unsigned char *newVariable = (char* ) passedVariable;
为什么能这样做? 我总是尽量在使用符号/无符号一致的,因为我知道,这两者之间的切换可能会造成问题,但是这似乎开发商并不关心。
改变指针类型不是一个真正的问题,该地址仍然有效。 然而解释所指的数据作为符号/无符号使得当且仅当...的签约数据为负的差异。 因此,在你的例子,如果你的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这在很多平台上需要一个符号的字符,所以你必须从某个地方投来避免警告。
对于一个指针作为符号和无符号字符大小相同的内存,这仅仅是地址不要紧,这么久。 和无符号字符*最有意义的一个任意的存储器地址 - 这就是为什么最纯粹的记忆功能,把它作为一个arguemnt
在字符串的情况下,你的例子看起来,它可能并不重要。 ASCII值只能从0-127去,这意味着他们将适合在有符号或无符号的字符无故障。 另外,未修饰的符号性char
是实现定义(因此存在signed
关键字)。 如果char
是一个无符号的类型,你的例子不会有任何的符号转换的。
在一般情况下,在你的榜样铸造的类型用于与使用不同的编码风格或使有关的符号性的不同假设第三方代码时闭嘴“指针符号”的警告char
。 它并不总是能够在这样的情况下保持一致,但铸造改变字符串指针的符号是不太可能引起任何问题。
是否带符号char
不是由C语言规定,是因为一个字符不是一个天生的签署值,当C是标准化的,一些实现它们当作签署有的没的。 因此,它始终是安全的转换char
要么signed char
或unsigned char
。 前者是不常见的,但后者是为了使用炭作为数组索引或文件ctype.h的参数is...
和to...
功能。 但是,如果没有看到任何一个使用的实际代码的unsigned char*
指针,这是不可能的,为什么它正在使用是肯定的。