c++ - 字符签名最严重的副作用。 (解释符号对字符和类型转换的影响)

标签 c++ debugging casting signedness

在 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/

相关文章:

c - 类型转换函数参数

c - 将整数类型转换为 C 中的字符指针

c++ - 在 switch case 语句中,它表示 "duplicate case value"作为错误出现。有人知道为什么吗?

c++ - 双三次图像缩小

c++ - 创建发布版本时,我收到以下警告(与 2008 设置相比)

javascript - 如何调试 JavaScript 对象问题?

c++ - 关于调试,多线程的面试题

testing - 分开 'debug' 和 'release' 构建?

c++ - 如何为生成艺术目的在单个缓冲区上绘制

kotlin - 将具有任何上限的已转换泛型类型转换为非空