您好,我是C编程语言的新手,在变量部分的数据类型中,char是1个字节,只能容纳一个字符,而int是4个字节,它可以容纳-2147483648
到{{ 1}}。因此,我尝试破坏以下程序的大小。
2147483647
输出:-
#include <stdio.h>
int main() {
int num = 2147483700;
printf("%d", num);
return 0;
}
我期望与尺寸有关的错误消息。
答案 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 -Wextra
或clang -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.