18

下面的代码是否正确?

char mychar = 200;
printf("%x", mychar);

根据http://www.cplusplus.com/reference/clibrary/cstdio/printf/ %x需要一个整数(我的编译器为 4 个字节),我只在这里传递 1 个字节。由于printf使用了可变参数,我担心这仅适用于堆栈上的字节对齐(即,当压入堆栈时,char 总是使用 4 个字节)。

我认为最好写成:

char mychar = 200;
printf("%x", static_cast<int>(mychar));

你认为第一个代码是安全的吗?如果不是,你认为如果我切换到 bigendian 架构,我会得到不同的输出吗?

4

4 回答 4

27

在您的示例中,参数实际上是 type int。由于默认参数promotionsmychar而被提升。int

(C99,6.5.2.2p6)“如果表示被调用函数的表达式的类型不包括原型,则对每个参数执行整数提升,并且将浮点类型的参数提升为双精度。这些被称为默认参数提升。 "

和(强调我的):

(C99, 6.5.2.2p7) "如果表示被调用函数的表达式具有包含原型的类型,则参数将隐式转换为相应参数的类型,就像通过赋值一样,采用每个参数的类型参数是其声明类型的非限定版本。函数原型声明器中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是在尾随参数上执行的。"

请注意,从技术上讲,x转换说明符需要一个unsigned int参数,但int保证unsigned int类型具有相同的表示形式。

于 2012-07-11T11:53:39.307 回答
3

这仅适用于您,因为您的平台能够将int(您char的晋升)解释为unsigned,这是%x预期的。为确保这始终有效,您应该使用适当的格式说明符,即%d.

由于您似乎希望将其char用作数字量,因此最好使用两种替代类型signed charunsigned char明确您的意图。char可以是平台功能的有符号或无符号类型。unsigned char那么正确的说明符是%hhx.

于 2012-07-11T12:04:13.883 回答
0

只需使用printf("%hhx", mychar)。请不要使用 cplusplus.com 作为参考。这个问题只是证明了它包含许多错误和遗漏大量信息的声誉。

于 2012-07-13T18:18:57.987 回答
-1

如果您使用的是 C++,那么您可能想要使用流。

您需要将字符转换为整数,否则它们将被打印为字形。另外,有符号的字符会在转换过程中进行符号扩展,所以最好使用无符号字符。例如,持有 0xFF 的字符将打印为 0xFFFFFFFF,除非先转换为无符号字符。

#include <iostream>
#include <iomanip>

int main(void){

    char c = 0xFF;
    std::cout << std::hex << std::setw(2) << std::setfill('0');
    std::cout << static_cast<int>(static_cast<unsigned char>(c)) << std::endl;

    return 0;
}
于 2012-07-11T12:20:26.293 回答