我想了解打印出一个char和一个未签名的char的结果。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int8_t a = 0xA1;
uint8_t b = 0xA1;
printf("0x%x,", a);
printf("0x%x,", b);
std::cout << std::hex << a << ",";
std::cout << std::hex << b << std::endl;
}
结果
0xffffffa1,0xa1,�,�
我不明白为什么带符号的char变成uint或int,为什么std :: hex失败了。
答案 0 :(得分:3)
int8_t a = 0xA1;
导致签名溢出,因此行为未定义。如果打开了正确的编译器标志,您将get类似于:
error: overflow in conversion from 'int' to 'int8_t' {aka 'signed char'} changes value from '161' to '-95' [-Werror=overflow]
8 | int8_t a = 0xA1;
| ^~~~
此外,%x
期望unsigned int
。这也会导致未定义的行为。您打算执行以下操作:
#include <iostream>
int main()
{
int8_t a = 42; // Doesnt overflow
uint8_t b = 42;
std::printf("%#x,", static_cast<unsigned int>(a));
std::printf("%#x,", static_cast<unsigned int>(b));
std::cout << std::hex << static_cast<unsigned int>(a) << ",";
std::cout << std::hex << static_cast<unsigned int>(b) << std::endl;
}
输出:0x2a,0x2a,2a,2a