当在C中进行整数提升时,sizeof(char)是否应该返回1而不是4?

oxcyiej7  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(77)
#include <stdio.h>

int main()
{
   unsigned char c = 'a';
    c = c + 3;
    printf("%c ", c);
    printf("%zu",sizeof(c));

    return 0;
}

输出:d 1
当整数提升在C中隐式地发生时。那么为什么char的大小是打印1(字节)而不是4(字节),因为大小应该增加到32位对吗?
我认为输出应为:d4

6kkfgxo0

6kkfgxo01#

正确的是c + 3的计算涉及整数提升,即结果的类型是int。但是,当您使用c = ...将结果存储在char变量中时,它将再次转换回char。赋值不会(不能)改变变量的大小。
试试这个代码:

char c = 'a';
printf("%zu\n", sizeof(c));
printf("%zu\n", sizeof(c + 3));
c = c + 3;
printf("%zu\n", sizeof(c));

在我的系统上,它给出:

1
4
1
n1bvdmb6

n1bvdmb62#

请参见C99标准或C11标准,在6.5.3.4标题为“The sizeof and _Alignof operators”的章节中-第4点
当sizeof应用于类型为char、unsigned char或signed char(或其限定版本)的操作数时,结果为1
对于C99标准,在6.5.3.4标题为运算符的大小的部分www.example.com下,点#3 -
当应用于类型为char、unsigned char或signed char(或其限定版本)的操作数时,结果为1。
也就是说,无论使用什么编译器实现或环境,char的大小,结果总是1。
在C99标准的www.example.com部分引用了代码示例5.1.2.3,参考#10
示例2在执行片段时

char c1, c2; 
/* ... */ 
c1 = c1 + c2;

“整数提升”要求抽象机器将每个变量的值提升为int size,然后将两个int相加并截断总和。如果两个字符的相加可以在没有溢出的情况下完成,或者在溢出 Package 的情况下静默地产生正确的结果,则实际执行只需要产生相同的结果,可能省略提升。
因此,基于这个问题,是的,整数提升会发生,它是在重新计算回到char类型之后总是返回1。只要值没有溢出,并且它福尔斯字节值的最大大小,即255.

相关问题