谁能解释以下代码输出?

时间:2019-05-07 15:37:13

标签: c

您好,我是C编程语言的新手,在变量部分的数据类型中,char是1个字节,只能容纳一个字符,而int是4个字节,它可以容纳-2147483648到{{ 1}}。因此,我尝试破坏以下程序的大小。

2147483647

输出:-

#include <stdio.h>

int main() {
    int num = 2147483700;
    printf("%d", num);

    return 0;
}

我期望与尺寸有关的错误消息。

2 个答案:

答案 0 :(得分:4)

这是超出范围转换的结果。在这种情况下,尝试将int范围之外的值存储在int中。由于int已签名,因此转换以实现定义的方式发生。

在使用负数的二进制补码表示的系统上,这通常意味着该值回绕,这就是您在此处看到的内容。

编译器不需要在此类情况发生时发出警告,但如果愿意,则可以发出警告。例如,gcc不会警告-Wall -Wextra,但会警告-Wconversion

此行为在C standard的6.3.1.8节中有关于整数转换的说明:

  

1 将整数类型的值转换为另一种整数类型时   以外   _Bool,如果该值可以用新类型表示,则它保持不变。

     

2 否则,如果新类型是无符号的,则值为   通过重复加减乘除   新类型可以表示的最大值   直到该值在新类型的范围内。

     

3 否则,将对新类型进行签名,并且值不能为   代表其中;结果要么是实现定义的,要么是   会发出实施定义的信号。

答案 1 :(得分:0)

出于历史原因,C编译器默认情况下非常宽容,可以接受愚蠢的错误而不会闪烁。

最好向编译器询问其他警告,并使用-Wall -Werror或更严格的设置(例如gcc -Wextraclang -Weverything来产生这些错误。

这是我的踪迹:

chqrlie$ clang -Wall -Werror overf.c
overf.c:4:15: error: implicit conversion from 'long' to 'int' changes value from 2147483700 to -2147483596 [-Werror,-Wconstant-conversion]
    int num = 2147483700;
        ~~~   ^~~~~~~~~~
1 error generated.