【发布时间】:2011-05-20 08:14:43
【问题描述】:
我最近遇到this question,其中 OP 在打印变量的十六进制值时遇到问题。我相信问题可以通过following code来总结:
#include <stdio.h>
int main() {
char signedChar = 0xf0;
printf("Signed\n”);
printf(“Raw: %02X\n”, signedChar);
printf(“Masked: %02X\n”, signedChar &0xff);
printf(“Cast: %02X\n", (unsigned char)signedChar);
return 0;
}
这给出了以下输出:
Signed
Raw: FFFFFFF0
Masked: F0
Cast: F0
用于每个打印的格式字符串是%02X,我一直将其解释为“将提供的int 打印为至少两位数字的十六进制值”。
第一种情况将signedCharacter作为参数传递并打印出错误的值(因为int的其他三个字节都设置了它们的所有位)。
第二种情况解决了这个问题,通过对值应用位掩码 (0xFF) 来删除除最低有效字节之外的所有字节,其中存储了char。这应该工作吗?确定:signedChar == signedChar & 0xFF?
第三种情况通过将字符转换为unsigned char 来解决问题(这似乎清除了前三个字节?)。
对于上述三种情况,谁能告诉我行为是否已定义?如何/在哪里?
【问题讨论】:
-
小于
int的整数类型在传递给 printf 时被提升为int。 -
由于 C 标准中没有定义数字的底层位表示,因此未指定确切的输出。
-
@Paul R:那么在第二种情况下,提升总是在应用位掩码之前进行吗?或者它会在面具没有效果之后发生吗?
-
char的签名是实现定义的,顺便说一下。如果您想要签名字符,请使用signed char。 -
@unwind:真的吗?我一直假设变量是默认签名的,除非您另有说明。整数也一样吗?