为什么 sizeof(char + char) return 4?
Why does sizeof(char + char) return 4?
char a, b;
printf("%d", sizeof(a+b));
printf 将向屏幕写入什么?
我以为因为sizeof(char)=1,所以sizeof(a+b)也会是1,结果是4,我不明白,为什么我们写成4添加两个字符?
在 C 语言中,几乎所有算术运算符的操作数都经过隐式转换,称为普通算术转换,或者在这种情况下,整数提升. char
类型的操作数被提升为 int
类型,实际加法在 int
(或 unsigned int
的域内执行,具体取决于 char
的属性在那个平台上)。所以你的 a + b
实际上被解释为 (int) a + (int) b
。结果的类型为 int
并且 sizeof(int)
在您的平台上显然是 4。那4就是你看到的。
并且不要使用 %d
来 printf
sizeof
的结果。 sizeof
的结果具有类型 size_t
,而 %d
需要一个 int
参数。因此,要么使用正确的格式说明符
printf("%zu\n", sizeof(a+b));
或者如果你确定它适合的话,至少转换参数
printf("%d\n", (int) sizeof(a+b));
这和sizeof(char)
不一样,参数(即加法的结果)提升为int
所以sizeof(a + b)
实际上等同于 sizeof(int)
。如果将结果转换为 char
,它将是您所期望的。此外,sizeof
结果的正确格式说明符 size_t
是 %zu
而不是 %d
.
尝试
printf("%zu", sizeof((char) (a + b)));
char a, b;
printf("%d", sizeof(a+b));
printf 将向屏幕写入什么?
我以为因为sizeof(char)=1,所以sizeof(a+b)也会是1,结果是4,我不明白,为什么我们写成4添加两个字符?
在 C 语言中,几乎所有算术运算符的操作数都经过隐式转换,称为普通算术转换,或者在这种情况下,整数提升. char
类型的操作数被提升为 int
类型,实际加法在 int
(或 unsigned int
的域内执行,具体取决于 char
的属性在那个平台上)。所以你的 a + b
实际上被解释为 (int) a + (int) b
。结果的类型为 int
并且 sizeof(int)
在您的平台上显然是 4。那4就是你看到的。
并且不要使用 %d
来 printf
sizeof
的结果。 sizeof
的结果具有类型 size_t
,而 %d
需要一个 int
参数。因此,要么使用正确的格式说明符
printf("%zu\n", sizeof(a+b));
或者如果你确定它适合的话,至少转换参数
printf("%d\n", (int) sizeof(a+b));
这和sizeof(char)
不一样,参数(即加法的结果)提升为int
所以sizeof(a + b)
实际上等同于 sizeof(int)
。如果将结果转换为 char
,它将是您所期望的。此外,sizeof
结果的正确格式说明符 size_t
是 %zu
而不是 %d
.
尝试
printf("%zu", sizeof((char) (a + b)));