Cor*_*ein 6 c c++ printf types
char byte = 0xff;
printf("%lu\n", sizeof(byte)) // Output is '1'
printf("%x\n", byte); // Output is 'ffffffff'
Run Code Online (Sandbox Code Playgroud)
如果大小byte只有一个字节,那为什么printf()表现得好像是四个字节?
Igo*_*nik 15
在形式上,您的程序表现出未定义的行为:%x格式规范需要一个类型的参数unsigned int,但是您正在传递一个int,如下所述(帽子提示@R).这在现代二进制补机中实际上是无害的,因为int和unsigned具有兼容的位布局.但同样,从技术上讲,这是未定义的行为,修复它是一个好主意,如同printf("%x\n", (unsigned)byte);.
将参数传递给可变参数函数的规则表明,小于int的所有整数类型都被提升为int.否则,printf在看到时,如何%x从堆栈中获取一个字节或四个字节,怎么会知道呢?从标准:
5.2.2p7:
当给定参数没有参数时,参数的传递方式使得接收函数可以通过调用va_arg来获取参数的值.(18.10)...如果参数具有受积分约束的整数或枚举类型升级(4.5),或浮点类型受浮点升级(4.6),影响,参数值在调用之前转换为提升类型.
这就是你如何char变成一个int.未指定char是签名还是未签名,但显然,在您使用它的平台上是签名类型.所以它在升级时会得到符号扩展int.0xff是的(char)-1,0xffffffff是的(int)-1.
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |