简单的C评估结果是错误的

时间:2013-11-20 08:39:01

标签: c

我遇到了一件简单的事,但无法解释原因。 示例代码方案是

int e = 0x0000a8e7;
int t = 0xffffffff;

if (e < t)正在评估为假。显然e是+ ve,t是-1,因此e < t应该评估为false。为什么它仍然变为真实。有什么想法吗?

谢谢,

3 个答案:

答案 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)。