#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
6kkfgxo01#
正确的是c + 3的计算涉及整数提升,即结果的类型是int。但是,当您使用c = ...将结果存储在char变量中时,它将再次转换回char。赋值不会(不能)改变变量的大小。试试这个代码:
c + 3
int
c = ...
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
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.
2条答案
按热度按时间6kkfgxo01#
正确的是
c + 3
的计算涉及整数提升,即结果的类型是int
。但是,当您使用c = ...
将结果存储在char
变量中时,它将再次转换回char
。赋值不会(不能)改变变量的大小。试试这个代码:
在我的系统上,它给出:
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在执行片段时
“整数提升”要求抽象机器将每个变量的值提升为int size,然后将两个int相加并截断总和。如果两个字符的相加可以在没有溢出的情况下完成,或者在溢出 Package 的情况下静默地产生正确的结果,则实际执行只需要产生相同的结果,可能省略提升。
因此,基于这个问题,是的,整数提升会发生,它是在重新计算回到
char
类型之后总是返回1。只要值没有溢出,并且它福尔斯字节值的最大大小,即255.