我想通过班次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.有人有解释,希望是解决方案吗?
printf是一个可变参数函数,因此它的参数受默认促销规则的约束.对于这种情况,您的char被提升为int,并在该过程中进行符号扩展.具有二进制模式0xffffffb2的4字节的2的补码int是-78.使用说明%hhx符将其打印为char .
另请参阅打印字符时会发生哪些积分促销?