【发布时间】:2012-07-11 11:51:23
【问题描述】:
下面的代码正确吗?
char mychar = 200;
printf("%x", mychar);
根据http://www.cplusplus.com/reference/clibrary/cstdio/printf/ %x 需要一个整数(我的编译器为 4 个字节),而我在这里只传递 1 个字节。由于printf 使用可变参数,我担心这仅适用于堆栈上的字节对齐(即,一个字符在压入堆栈时总是使用 4 个字节)。
我觉得这样写比较好:
char mychar = 200;
printf("%x", static_cast<int>(mychar));
你认为第一个代码是安全的吗?如果不是,你认为如果我切换到 bigendian 架构,我会得到不同的输出吗?
【问题讨论】:
-
就我个人而言,我会谨慎行事并写
(int)mychar;在最坏的情况下我浪费了五个字符,在最好的情况下我避免了 UB。此外,与语言的尘土飞扬的角落一样,我更喜欢更加清晰/安全,以避免让我的代码的未来读者感到困惑。 -
有趣的问题,printf 是否隐式转换?使用 static_cast 你总是安全的
-
@Paranaix:这不是
printf本身,而是提升某些类型的可变参数(例如,float总是提升为double)。 -
@Matteo Italia 好吧,我宁愿考虑函数本身的转换(因此取决于实现)而不是调用本身的转换
标签: c++ c variadic-functions