gpt4 book ai didi

C 数据类型的范围

转载 作者:行者123 更新时间:2023-11-30 20:31:27 24 4
gpt4 key购买 nike

#include <math.h>

int main(){

signed char b = 32767;
if (b){
printf("YES");
}
else
printf("NO");
}

我没想到它会编译,因为有符号字符的范围是 [−127, +127] ??我还尝试输入一个 8 位的值(12345678),也可以编译,但是,9 位导致我的 Avast 防病毒软件出现,我以为程序挂起,但过了一会儿才编译。我的问题是应该'对于有符号 char 数据类型,编译器会拒绝 [−127, +127] 之外的任何值吗?

最佳答案

C 是一种老式语言。不要说“我没想到它会编译,因为......”。一般来说,大多数 C 编译器都会尽最大努力为您编译一些东西,即使这很危险。不要说“编译器不应该拒绝任何超出范围的值吗?”之类的话。大多数 C 编译器不会仅仅因为它们是一个坏主意而拒绝它们,甚至因为它们可能不起作用。

然而,大多数现代编译器都会警告您有关不好的想法,但即使如此,您可能也必须显式请求此类警告,因为在默认模式下,编译器可能仍然在老派的假设是程序员知道他在做什么。

在 C 中,无符号 类型的溢出保证了行为——实际上,总是执行算术运算,以类型的大小为模。尽管不能保证这一点,但大多数处理器和大多数编译器也会针对有符号类型的溢出实现相同的功能——并且可能有相当多的代码依赖于此。因此,这是编译器有关有符号整数溢出的警告不一定很突出的另一个原因。

话虽如此,我在两个不同的编译器下尝试了你的代码。一个说“警告:隐式常量转换中溢出”,另一个说“警告:从‘int’到‘signed char’的隐式转换将值从 32767 更改为 -1”。

如果您的编译器没有向您发出此类警告,您将需要 (a) 确保启用所有警告(使用配置设置对话框中某处的复选框,或者使用命令行选项标志,例如 -Wall),或 (b) 获得更好的编译器。

关于C 数据类型的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50946280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com