我遇到了一件简单的事,但无法解释原因。 示例代码方案是
int e = 0x0000a8e7;
int t = 0xffffffff;
if (e < t)
正在评估为假。显然e
是+ ve,t
是-1,因此e < t
应该评估为false。为什么它仍然变为真实。有什么想法吗?
谢谢,
答案 0 :(得分:1)
只是一个想法。你int
的大小是多少?通过打印sizeof(int)
来检查它。
你假设你的int
是32位,但是如果它是16位你溢出t
然后发生了什么是实现定义,所以每台机器可能会以不同的方式解决这个问题,而你的做了e<t
的事情而我的事情却没有。
答案 1 :(得分:1)
有两种选择:
sizeof(int) > 4
(43239&lt; 4294967295)== true
sizeof(int) == 2
,此特定实现定义了行为
( - 22297&lt; -1)== true
答案 2 :(得分:1)
您可能遇到实现定义的行为。这意味着您的代码是合法的,但每个实现(即每个编译器)可能以不同的方式执行。以下是C规范的相关摘录:
第6.7.8节第11段
标量的初始值设定项应为单个表达式,可选择用大括号括起来。对象的初始值是表达式的初始值(转换后);与简单赋值相同的类型约束和转换适用,将标量的类型作为其声明类型的非限定版本。
第6.3.1.3节第3段
否则,新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。
如果在您的实现中,int
是32位,则0xffffffff
太大而无法容纳32位int(最多可容纳2,147,483,647,但0xffffffff
= 4,294,967,295)。