- 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/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!