【发布时间】:2022-01-14 06:18:54
【问题描述】:
请原谅我这个新手问题。我最近在将 char 转换为 short 时发现了一件奇怪的事情。基本上,如果字符溢出,当转换成short时,二进制数会在前面加上11111111。如果字符没有溢出,它将在前面加上00000000。
例如,
char a = 130;
short b = (short)a;
printf("%hhx\n", a);
printf("%hx\n", b);
打印
82
ff82
虽然
char a = 125;
short b = (short)a;
printf("%hhx\n", a);
printf("%hx\n", b);
打印
7d
7d
所以在进行强制转换时,是否在确定将其强制转换为哪个二进制数之前检查变量类型和值(决定 b/w 前置 0xFF 还是 0x00)?这背后有什么原因吗?似乎总是做(short)a & 0x00FF 会是一个好习惯吗?
【问题讨论】:
-
您只是看到了有符号值扩展的机制。
-
两个(不相关的)问题:1)如果您觉得需要在 C++ 中进行 C 风格的转换(如
(short)a),那么您应该将其视为您正在做的标志有事吗; 2) 为什么在 C++ 代码中使用printf? -
与您的问题更相关的是,如果
char是有符号或无符号的,它是特定于实现的(即取决于编译器)。 -
代码中的演员表无关;编译器会在没有被明确告知的情况下进行转换。
-
进行位处理时的良好做法是使用名称中指示位的类型。例如 uint16_t 代替 short 或 int8_t 代替 char。这些使代码读者更清楚逻辑依赖于精确的位。包含
以获得这些类型。
标签: c++ casting char type-conversion short