当前位置: 首页 > 知识库问答 >
问题:

为什么将超出范围的值赋给有符号类型的对象的结果在C中没有定义?[重复]

戈安翔
2023-03-14

如果我们给无符号类型的对象分配一个超出范围的值,结果是剩余的值与目标类型可以容纳的值的数量成模。这是很自然的。但是,如果我们将超出范围的值指定给有符号类型的对象,则结果是未定义的。为什么C标准没有准确定义这种行为的结果,比如无符号的情况???


共有1个答案

许涵容
2023-03-14

因为有些处理器会在算术翻转时生成硬件异常。为了定义行为,C代码必须在几乎每一条alu指令之间插入一个陷阱,使程序慢到爬行。

 类似资料:
  • 问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp

  • 在下面的代码中 为什么当console.log(x)时,x是未定义的?

  • 我满足了一些深度复制原始对象文字的需求,除了一些键。我知道扩展运算符不会深度复制整个嵌套对象,但这不是这个问题的要点,所以让我们通过这个问题。 所以,回到原来的问题,我看不出使用delete关键字和将undefined分配给我要删除的目标属性之间有什么区别。 似乎方式没有那么冗长,但这样完全可以吗?

  • 最近,我不得不执行一些从< code>float到16位整数的数据类型转换。本质上,我的代码简化为以下内容 这个输入值是一个问题,在我的代码中,我忽略了检查浮点值的限制,所以我可以看到我的错误,但它让我想知道当一个人必须进行这种笨拙的转换时,语言的确切规则。我有点惊讶地发现cast的值是-32768。此外,每当浮点值超过16位整数的限制时,我都会得到这个值。我曾在谷歌上搜索过这个,但发现令人惊讶的

  • 如果我有一个Web应用程序,它的应用程序上下文加载了我的webapp和所有作业配置文件的所有内容,如果我的作业中有一个没有范围="步骤"的简单ItemReader,那么阅读器是单例的,对吗?所以如果我通过SimpleJobLauncher从控制器启动两次作业,我会使用同一个bean,对吗?除非我放入范围="步骤",以便每个作业执行一个bean? 另一方面,如果我从CommandLineJobRun

  • 问题内容: 这是我的第一篇文章,所以请对我“轻松”。:) …我对许多传统的编程语言非常熟悉,但是我是Go语言的新手,很难理解切片和范围的用法。下面的程序代码和注释说明了我的震惊。谢谢! 编写了自己的Mod函数,因为在Go库中找不到。 声明结构数组并添加一些记录 加载数据会产生我期望的输出 现在,我修改值并打印它们,以查看它们是否显示为已修改。这看起来像预期的那样。 现在,我只需再次遍历同一范围并打