Char 与 unsigned char 转换为 int

标签 c char data-conversion unsigned

<分区>

我在将 int 保存到 char 数组并将其转换回来时偶然发现了这个问题。我使用位移位和逻辑或,但我的结果以最低有效位之后的所有字节为 0xFF。

我的问题是:考虑这个例子

#include <stdio.h>

int main() {
        char c1 = 0x86;
        unsigned char c2 = 0x86;
        unsigned int i1 = 0, i2 = 0;

        i1 = (unsigned int) c1;
        i2 = (unsigned int) c2;

        printf("%x-%x\n", i1, i2);
}

为什么输出是ffffff86-86?为什么 char 的所有高位都设置为 1?

我确信有一个非常简单的答案,但我想不出一个足够具体的查询来在谷歌上找到它。

最佳答案

如果 char 是有符号的或无符号的,它是实现定义的。

如果char是有符号的,那么当是promoted to an int时它将符号扩展,因此负值将在提升后保持其负值。

前导 1 位是负数在 two's complement 中的表示方式系统,这是处理负数的最常见方式。


如果您的编译器对 char 进行了签名(看起来是这样),那么 c1 的初始化应该会生成一个警告。如果没有,则您需要启用更多警告。

关于Char 与 unsigned char 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49273109/

相关文章:

swift - 如何将 : Cannot convert value of type: GameData - Codeable, 修复为预期参数数据

c - rle压缩算法c

创建链表,不传回Main

C:将带有字符串的结构复制到共享内存

c++ - D语言调用C++(C)

c - scanf 正在使用未初始化的变量; C

c - 获取多个字符串作为输入

c++ - 无法从 'unsigned char *' 转换为 'char *'

java - 如何将有向无环图转换为树

r - 将列转换为序列