这个C程序的输出是什么?它是如何工作的?

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

int main()
{
    signed char a = 200;
    signed char b = 3;
    signed char c = 2;
    signed char res = (a * b)/c;
    
    printf("%d\n", res);

    return 0;
}

上面代码的输出和简要说明?因为res类型应该升级为integer,我以为它会打印-212,但实际输出是-84。

6xfqseft

6xfqseft1#

假设你在一个SCHAR_MAX小于200的平台上(在大多数平台上都是这样),那么,根据ISO C11标准的§6.3.1.3 ¶3,行

signed char a = 200;

将向a写入一个实现定义的值,或引发一个实现定义的信号。大多数平台将简单地从200中减去值UCHAR_MAX+1。假设UCHAR_MAX的值为255(在大多数平台上都是这种情况),这意味着它将把值-56写入a
那条线

signed char res = (a * b)/c;

因此等于:

signed char res = (-56 * 3)/2;

这相当于:

signed char res = -84;

值得注意的是,该子表达式

(a * b)

将计算为-168,即使该值小于SCHAR_MIN。这是因为结果的类型是int。作为通常算术转换的一部分,两个操作数都升级为int,这意味着结果也是int
由于结果-168在分配给signed char之前被除以2,因此它的值为-84,ISO C标准保证该值可以用signed char表示(SCHAR_MIN保证等于或小于-127)。

nuypyhwy

nuypyhwy2#

表达式(a * b)/c似乎会导致算术溢出,因为有符号字符只能有从-128127的值(在大多数平台上),而a的值是-56-56*3-168-168/2-84。但在计算中,它对int值执行操作,因此没有溢出。

相关问题