在 C++ 中处理字节时,我经常使用使用 char 的库。另一种方法是将“字节”定义为无符号字符,但这不是他们决定使用的标准。我经常将字节从 C# 传递到 C++ dll 并将它们转换为 char 以使用该库。
当将整数转换为字符或将字符转换为其他简单类型时,可能会出现哪些副作用。具体来说,您何时处理过这个损坏的代码,您是如何发现它是因为 char 签名的?
幸运的是,我的代码中没有遇到这种情况,在学校的嵌入式系统类(class)中使用了一个字符签名的转换技巧。我希望更好地理解这个问题,因为我觉得它与我正在做的工作相关。
最佳答案
一个主要风险是您是否需要移动字节。有符号的字符在右移时会保留符号位,而无符号的字符则不会。 这是一个小测试程序:
#include <stdio.h>
int main (void)
{
signed char a = -1;
unsigned char b = 255;
printf("%d\n%d\n", a >> 1, b >> 1);
return 0;
}
它应该打印 -1 和 127,即使 a 和 b 以相同的位模式开始(给定 8 位字符、二进制补码和使用算术移位的有符号值)。
简而言之,您不能依赖 shift 对有符号和无符号字符进行相同的工作,因此如果您需要可移植性,请使用 unsigned char
而不是 char
或 签名字符
.
关于c++ - 字符签名最严重的副作用。 (解释符号对字符和类型转换的影响),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192880/