C++ 我可以在printf中需要整数的地方传递一个字符吗?
以下代码正确吗C++ 我可以在printf中需要整数的地方传递一个字符吗?,c++,c,variadic-functions,C++,C,Variadic Functions,以下代码正确吗 char mychar = 200; printf("%x", mychar); 根据%x需要一个整数(我的编译器需要4个字节),我在这里只传递1个字节。由于printf使用varargs,我担心这只会因为堆栈上的字节对齐而起作用(即,在堆栈上推送字符时,字符总是使用4个字节) 我认为最好写下: char mychar = 200; printf("%x", static_cast<int>(mychar)); char mychar=200; printf(“%
char mychar = 200;
printf("%x", mychar);
根据%x
需要一个整数(我的编译器需要4个字节),我在这里只传递1个字节。由于printf
使用varargs,我担心这只会因为堆栈上的字节对齐而起作用(即,在堆栈上推送字符时,字符总是使用4个字节)
我认为最好写下:
char mychar = 200;
printf("%x", static_cast<int>(mychar));
char mychar=200;
printf(“%x”,静态_转换(mychar));
你认为第一个密码是安全的吗?如果不是,您认为如果切换到bigendian体系结构,是否可以获得不同的输出?在您的示例中,参数实际上是
int
类型<由于默认参数升级,code>mychar升级为int
(C99,6.5.2.2p6)“如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为双精度。这些被称为默认参数提升。”
和(我的重点):
(C99,6.5.2.2p7)“如果表示被调用函数的表达式的类型确实包含原型,参数会像赋值一样隐式转换为相应参数的类型,将每个参数的类型视为其声明类型的非限定版本。函数原型声明器中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止默认参数
对尾部参数执行升级”
请注意,从技术上讲,
x
转换说明符需要一个unsigned int
参数,但是int
和unsigned int
类型保证具有相同的表示形式。这只适用于您,因为您的平台能够解释int
(您的字符
被提升到该字符)作为一个无符号
,这是%x
所期望的。为了确保这始终有效,您应该使用适当的格式说明符,即%d
由于您似乎希望使用
char
作为数字量,因此最好使用两种可选类型signed char
或unsigned char
来明确您的意图。char
可以是平台函数上的有符号或无符号类型。unsigned char
然后是<代码> %HHX .< /P> < P>如果您使用C++,那么您可能需要使用流。
您需要将字符强制转换为整数,否则它们将作为字形打印。此外,在强制转换期间,有符号字符将进行符号扩展,因此最好使用无符号字符。例如,持有0xFF的字符将作为0xFFFFFF打印,除非先强制转换为无符号字符
#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;
}
#包括
#包括
内部主(空){
字符c=0xFF;
std::cout简单地使用。请不要使用cplusplus.com作为参考。这个问题只能证明它包含许多错误并遗漏了很多信息的声誉。就我个人而言,我会谨慎行事并编写(int)mychar
;在最坏的情况下,我浪费了五个字符,在最好的情况下,我避免了UB。此外,与语言的灰尘角落一样,我更喜欢格外清晰/安全,以避免让我的代码的未来读者感到困惑。有趣的问题是,printf是否会不自然地施放?静态的情况下,你总是在保险箱上施放side@Paranaix:它不是printf本身,但提升某些类型的变量参数(例如,float
总是提升为double
)。@Matteo Italia嗯,我更愿意考虑函数本身的转换(因此取决于实现)而不是电话里的转换itself@Naveen是的,C++ 11 5.2.2/7或多或少地说了同样的事情。@纳威:是的,非常多。C++不时有不同的类型(例如,代码>布尔O/COD>)这是有自己的推广规则的,但其他的是一样的。我知道。但是我们在这里使用C++。你能确认C++标准是否相同?@迈克说,“C++”在C++ 11、5.2.2p7中基本上是相同的规则,也叫它们默认的参数提升。如果我错了,请纠正我,但是当<代码> sieof(int)时,请改正。==1
和char
默认为unsigned
,则char
不会提升为int
,而是unsigned int
。使用%d
不是仅在假设char
有符号的情况下才可靠吗?C说int
和unsigned int
具有相同的大小和相同的长度C99,6.2.5p6中的对齐要求。@larsmans,它只能在假设的架构上失败,其中char
是无符号的,并且具有与unsigned int
相同的宽度。在所有其他架构上char
提升到int
而不是unsigned int
@ouah,是的,但是unsigned int
可以VE填充位和陷阱表示。虽然这不太可能,而且在从<代码> char >中推广时更不可能遇到这样的陷阱表示:“JjggStudt:”我明白了。谢谢!离主题-----在C++中有充分的理由使用STDIO。