相关疑难解决方法(0)

char是默认提升的吗?

这可能是一个愚蠢的问题,但有人可以请为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将转换为doubleb转换为int.但是会发生什么c?我一直都认为这char也得到提升int,但我无法在标准中找到相关的陈述.

c c++ integer-promotion language-lawyer

15
推荐指数
2
解决办法
1194
查看次数

为什么sizeof(char + char)返回4?

char  a, b;     
printf("%d", sizeof(a+b));
Run Code Online (Sandbox Code Playgroud)

printf写入屏幕的内容是什么?

我认为因为sizeof(char)= 1,sizeof(a + b)也将是1,但结果是4.我不明白这一点,如果我们添加两个字符,为什么写4?

c sizeof char

9
推荐指数
2
解决办法
485
查看次数

这里发生了什么?sizeof(short_int_variable + char_variable)

#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 variables sizeof

8
推荐指数
1
解决办法
243
查看次数

是否在C表达式中自动提升字符?

我向我的一位同事发了言,其中:

"字符在C表达式中自动提升为整数,这对性能很好,因为CPU的自然字大小最快.

我认为由于char的排名,在标准的某处陈述了char促销行为.

这是我回复的回复:

"字符不是默认提升为整数.寄存器大小为32位,但一行中的多个字节值可以作为编译器实现打包到单个寄存器中.这并不总是预测性的.唯一可以验证自动升级的时间是因为C标准在调用堆栈内存中正式需要32位值时类型被传递到调用堆栈中,因为C标准在调用堆栈内存中需要32位值.大量的CPU架构优化了非32位值的汇编调用,所以没有在这种情况下,可以对CPU或编译器做出假设."

我不确定谁是对的,还有什么可以相信的.有什么事实?

c c++ int char integer-promotion

4
推荐指数
1
解决办法
378
查看次数

对char的按位运算给出32位结果

我一直用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)

c char bitwise-operators

2
推荐指数
1
解决办法
3831
查看次数