- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <stdio.h>
void main()
{
unsigned char a = 0xfb;
char b = 0xfb;
printf("case1 : %d, %d", a, b); // case1
char x=90, y=60, z=100, h;
h = x*y/z;
printf("\ncase2 : %d", h); // case2
int m = 32768, n = 65536, o = 2, i;
i = m*n/o;
printf("\ncase3 : %d", i); // case3
}
result
case1 : 251, -5
case2 : 54
case3 : -107341824
在 case1 中,标识符 b 被编译为 -5,这不是语法错误,认为 char 只接受 -128~127 值。那么,第一个问题是标识符b在翻译结束时首先保存为int数据类型?(翻译结束时,b将保存为char。)
在 case2 中,x,y 被提升为 int。所以 h 有正确的结果值。但在 case3 中,m、n 不会被提升为 unsigned int(也许)。标识符 I 没有普通值(2^30)。C99 这么说
If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int.
基于C99,h的值是自然的,但是处理m*n/o是溢出的。这不自然,因为它反对 C99。这是我的第二个查询。
最佳答案
In case1, identifier b is compiled as -5, which is not syntax error thought char only accept -128~127 value. So, first question is identifier b is firstly saved as int data type by end of its translation?(When translation is end, b will be saved in char.)
在情况 1 中,变量 b
的初始值设定项,即常量 0xfb
表示一个 int
类型的值,其值为 251(十进制) .在 C 抽象机器模型中,当初始化程序运行时,此值将转换为 b
的类型 (char
),对于 block 范围变量,当执行到达该值时声明(不是在翻译期间)。如果您的实现中 char
的范围确实是 -128 - 127,那么您已经签署了不能表示初始化程序值的 char
,从而导致实现定义的行为。
因此,再次引用抽象机器模型,nothing 在翻译结束时存储在 b
中。它是一个 block 作用域变量,因此在执行到达其声明之前它不存在。翻译后的程序确实需要以某种方式存储 b
的初始值,但 C 并未指定它应该以何种形式存储。然而,在翻译或执行期间,b
不会包含 int
类型的值。
当 printf
调用的参数被求值时,b
的值被读取,然后转换为 int
(因为它是可变参数)。可以说,可以使用 %d
字段来打印它,但是如果您想确定打印转换前的值,那么您应该真正使用 %hhd
代替(尽管在您的情况下,这几乎肯定会打印相同的结果)。
In case2, x, y is promoted as int. So h has right result value.
更具体地说,在情况 2 中, x
、y
和 z
的值被提升为int
在计算表达式 x*y/z
期间,每个操作都会产生一个 int
结果。乘法不会溢出所选类型 int
,整体结果在 char
类型范围内,因此应用到 char
的转换在分配给 h
时是不起眼的。
But in case3, m, n aren't promoted as unsigned int(maybe). Identifier I doesn't have ordinary value(2^30).
在情况 3 中,m
、n
和 o
已经有类型 int
,所以它们不是提升,并且算术表达式计算相同类型 (int
) 的结果。子表达式 m*n
的结果不在 int
类型的范围内,因此会出现未定义的行为,根据 paragraph 6.5/5标准:
If an exceptional condition occurs during the evaluation of an expression (that is, if the result is not mathematically defined or not in the range of representable values for its type), the behavior is undefined.
这是真的
C99 [and C11] says that
If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int.
,但这在这里无关紧要。它是“整数提升”描述的一部分,它适用于表达式的操作数,基于它们的类型。
Being based on C99, value of h is natural, but dealing with m*n/o is overflowed. It's not natural because it's opposed to C99. This is my second query.
您似乎期望中间表达式 m*n
将被计算以产生 unsigned int
类型的结果,因此它不会溢出,但这是标准不支持。通常的算术转换,包括整数提升,仅基于操作数类型的特征,包括它们的符号和值范围。进行通常算术转换的运算符,包括 *
,使用它们来确定所有操作数和结果的通用类型。
您的 m
和 n
已经是同一类型,并且该类型是 int
,不适用任何转换/促销。如果 m
和 n
的值不是它们的乘积(作为 int),则乘法的结果也将是一个 int
不明确的。然而,事实上,该操作会溢出类型 int
,从而产生未定义的行为。
关于c - 为什么在我的情况下不会发生整数提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59483233/
在本教程中,您将通过示例学习 JavaScript。 JavaScript 中的提升是一种在声明之前可以使用函数或变量的行为。例如, // using test before declarin
我正在学习javascript提升功能,发现下面的代码真的很困惑: var a = 1; function b() { a = 10; return; function a()
作为一个JS学习者,我发现了一件很有趣的事情,考虑下面的代码。 this.init = function (e) { var container = e.container;
Quasiquotes 的 Scala 文档在解释 Lifting 时提到了这一点: One can also combine lifting and unquote splicing: scala
我是新来的。到目前为止,我一直在使用 MVC 模型并使用基本的 session 管理模型,即在 session 中存储一个 token 并检查每个请求。 我正在尝试对lift做同样的事情,但我的 se
我当前使用的是Elasticsearch 2.4版,希望根据查询时间的增加或加权,根据我称为“类型”的字段对结果集进行微调。 例如 如果字段“类型”的值为“船”,则将权重或增强值增加4 如果字段“类型
一年多以来,我一直在大量使用 lift、return 以及 EitherT、ReaderT< 等构造函数,等等。我读过《Real World Haskell》、《Learn You a Haskell
我浏览了电梯的MegaProtoUser遇到这种结构:??("Last Name")。谁能解释一下,这是什么意思? 谢谢解答 最佳答案 它是在对象 S 上定义的: def ??(str : Strin
我有一个Solr索引,每个文档都是一个Event的信息。在我的架构中,Schedule 是日期类型的多值字段。我想知道是否可以使用计划日期来增加文档(多值字段中的任何日期)在未来并且最接近当前日期?我
作为测试,我正在尝试使用设计人员友好的模板在 lift 中创建一个表单。我正在使用 Lift 2.5 我已经设法使用 toForm 创建了一个工作表单,但我只是在探索所有可能的方法。 我的 html
如果这个问题已经被问到,我深表歉意。 是否可以清除已经设置的条件变量? 下面是我想要实现的详细信息: void worker_thread { while (wait_for_conditio
尝试学习Js,无法理解为什么DOM元素没有获取到值: var Car = function(loc) { var obj = Object.create(Car.prototype); obj
我想知道吊装。我知道如果全局函数名称与全局变量相同,函数会覆盖变量的名称。是吗? 这是我的代码。 (function() { console.log('console.log#1 ' + glob
这个问题已经有答案了: var functionName = function() {} vs function functionName() {} (41 个回答) 已关闭 7 年前。 在javas
我正在开发 Windows 资源管理器 namespace 扩展。我的应用程序是explorer.exe在某个时候加载和使用的动态库。我需要我的 DLL 在 C:\中创建文件,有时在其他需要提升才能执
背景: GitHub 属于客户。我们团队中有一些新手,他们有时会错过基本的命名约定和其他编码协议(protocol)。所以,如果哪位前辈想在内部review,除了创建PR,别无他法。但是这个 PR 对
我们需要在运行时更改 HKEY_LOCAL_MACHINE 的一些设置。 如果需要在运行时,是否可以提示 uac 提升,或者我是否必须启动第二个提升的进程来完成“肮脏的工作”? 最佳答案 我会以提升的
看着Haskell文档,提升似乎基本上是 fmap 的概括,允许映射具有多个参数的函数。 Wikipedia然而,关于提升的文章给出了不同的观点,根据类别中的态射来定义“提升”,以及它如何与类别中的其
ggplot2 package 很容易成为我用过的最好的绘图系统,除了对于较大的数据集(约 50k 点)性能不是很好。我正在研究通过 Shiny 提供网络分析,使用 ggplot2作为绘图后端,但我对
是否可以提升 powershell 脚本的权限,以便没有管理员权限的用户可以运行该脚本?我们的网络管理员正在尝试寻找更省时的方法来完成某些任务,目前他们必须使用远程桌面...使用 PS 脚本将其自动化
我是一名优秀的程序员,十分优秀!