这可能是一个愚蠢的问题,但有人可以请为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,但我无法在标准中找到相关的陈述.
char a, b;
printf("%d", sizeof(a+b));
Run Code Online (Sandbox Code Playgroud)
printf写入屏幕的内容是什么?
我认为因为sizeof(char)= 1,sizeof(a + b)也将是1,但结果是4.我不明白这一点,如果我们添加两个字符,为什么写4?
#include <stdio.h>
int main()
{
short int i = 20;
char c = 97;
printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我当sizeof(a + b)"a是短int类型&b是char类型时会发生什么"输出是:2,1,4
我向我的一位同事发了言,其中:
"字符在C表达式中自动提升为整数,这对性能很好,因为CPU的自然字大小最快.
我认为由于char的排名,在标准的某处陈述了char促销行为.
这是我回复的回复:
"字符不是默认提升为整数.寄存器大小为32位,但一行中的多个字节值可以作为编译器实现打包到单个寄存器中.这并不总是预测性的.唯一可以验证自动升级的时间是因为C标准在调用堆栈内存中正式需要32位值时类型被传递到调用堆栈中,因为C标准在调用堆栈内存中需要32位值.大量的CPU架构优化了非32位值的汇编调用,所以没有在这种情况下,可以对CPU或编译器做出假设."
我不确定谁是对的,还有什么可以相信的.有什么事实?
我一直用C编写一个程序,将char的前4位移到最后,最后4位移动到开头.对于大多数值,它正常工作,以及反向操作,但对于某些值,如8,x,y,z,它给出32位值.通过打印变量的十六进制值来检查值.任何人都可以解释为什么会这样吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char o, f,a=15;
scanf("%c",&o);
printf("o= %d\n",o);
f=o&a;
o=o>>4;
printf("o= %d",o);
o=o|(f<<4);
printf("o= %x, size=%d\n",o,sizeof(o));
f=o&a;
o=o>>4;
printf("o= %d",o);
o=o|(f<<4);
printf("o= %x, size=%d\n",o,sizeof(o));
return 0;
}
Run Code Online (Sandbox Code Playgroud)