这可能是一个愚蠢的问题,但有人可以请为C++ 11和C11提供标准参考:
是char默认升为int?
这里有一点背景:C和C++都有默认参数提升的概念(C++ 11:5.2.2/7; C11:6.5.2.2/6).这需要在以下调用中提升参数:
void f(int, ...);
float a = 1; short int b = 2; char c = 'x';
f(0, a, b, c);
Run Code Online (Sandbox Code Playgroud)
对于函数调用,a将转换为double并b转换为int.但是会发生什么c?我一直都认为这char也得到提升int,但我无法在标准中找到相关的陈述.
请考虑以下简化代码.我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出.
我有额外的3个字节0xFFFFFF.怎么了?额外的字节来自哪里?
产量
in:
2000FFFFFFAF00690033005A00
out:
2000FFFFFFAF00690033005A00
Run Code Online (Sandbox Code Playgroud)
program.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int i;
char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00};
FILE *outfile;
char *buf;
printf("in:\n\t");
for( i=0; i<10; i++ )
printf("%02X", raw[i]);
outfile = fopen("raw_data.bin", "w+b");
fwrite(raw, 1, 10, outfile);
buf = (char *) malloc (32 * sizeof(char));
fseek(outfile, 0, SEEK_SET);
fread(buf, 1, 10, outfile);
printf("\nout:\n\t");
for( i=0; i<10; i++ )
printf("%02X", buf[i]);
printf("\n");
fclose(outfile);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 例如,我printf在C++中使用函数用于8位CPU(AVR).以下代码是否安全:
uint8_t a = 5;
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)
这里%d期望int(在我的情况下为16位,在任何情况下至少为16位),但我传递8位整数.
C/C++标准是否保证任何类型的等级小于int升级int?
同样的问题float a和%f期望double,以及其他类似的类型.