将`unsigned char`放入`char`中

gos*_*sbi 5 c++ casting

我想通过班次unsigned char存入一个char.由于两种数据类型具有相同的长度(我的机器上有1个字节),我希望以下代码可以工作:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int main () {

        printf ("%d\n", sizeof(char));
        printf ("%d\n", sizeof(unsigned char));

        unsigned char test = 49;
        char testchar = (char) (test - 127);
        printf ("%x\n", testchar);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.特别是,我得到了以下输出:

1
1
ffffffb2
Run Code Online (Sandbox Code Playgroud)

这表明char已被铸造int.有人有解释,希望是解决方案吗?

nos*_*nos 5

printf是一个可变参数函数,因此它的参数受默认促销规则的约束.对于这种情况,您的char被提升为int,并在该过程中进行符号扩展.具有二进制模式0xffffffb2的4字节的2的补码int是-78.使用说明%hhx符将其打印为char .

另请参阅打印字符时会发生哪些积分促销?


Don*_*ild 5

%x是4字节的说明符int.要打印一个字节char使用%hhx.

printf根据传递给它的格式说明符对其参数进行类型转换.这就是为什么testchar类型被提升为int.