十六进制表达式0x80000000在C语言的枚举声明中的含义是什么

时间:2013-04-23 03:20:10

标签: c xcode objective-c-2.0

我正在阅读iPhone示例项目的代码(Xcode IDE,Apple LLVM编译器4.2)。在该iPhone示例项目的外部库(用C语言编写)的头文件中,有一些事件以枚举类型声明:

typedef enum _Application_Events
{
    EVENT_EXIT = 0x80000000,
    EVENT_TOUCH,
    EVENT_DRAG,
    EVENT_RELEASE_TOUCH,
    EVENT_ROTATE_0,
    EVENT_ROTATE_90,
    EVENT_ROTATE_180,
    EVENT_ROTATE_270
} Application_Events;

我不明白为这些事件分配了哪种值。 0x80000000应该是一个大的正整数(2147483648),还是负零,或负整数(-2147483648)?

我在Xcode调试器中检查过,编译器是Apple LLVM编译器4.2,EVENT_EXIT等于(int) -2147483648EVENT_RELEASE_TOUCH等于(int) -2147483645,依此类推。

显然,他们是以two's complement代表处理的。可以找到相关帖子here

但我现在不确定的是:

(1)0x80000000的基础数据类型在其他情况下始终为int或其他什么?这取决于编译器或平台吗?

(2)如果我将十六进制值分配给这样的有符号整数,它是否总是被解释为二进制补码表示?这取决于编译器或平台吗?可以找到相关帖子here。可以找到另一个参考here

请分享一些想法。谢谢大家:D

4 个答案:

答案 0 :(得分:3)

与C语言中的许多东西一样,枚举只是一个整数。像这样设置第一个值将导致编译器从那里增加,保证所有枚举值都小于0.(作为有符号整数2s补码,设置的高位将表示负数)

可能,程序员选择此值可以发送各种事件,不应该与其他事件发生冲突。

简而言之,不要担心实际价值;这只是一个数字。使用该名称并理解它应该是在使用或返回这些代码的调用的上下文中的含义。

答案 1 :(得分:2)

枚举的基本类型是实现定义的。在这种情况下,基类型应该是unsigned int,因为标准要求编译器选择足够宽以容纳所有枚举值的基类型。从C99标准,第6.7.2.2.4节:

  

每个枚举类型应与 char ,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的, 108)但是应该能够表示枚举的所有成员的值。在 } 终止枚举器声明列表之前,枚举类型是不完整的。

     

     

108)实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。

答案 2 :(得分:1)

enum的基础类型取决于它需要保持的值。编译器对如何最终定义该类型有一定的自由度。在您的情况下,Application_Events的基础类型可能是unsigned int,因为它大于INT_MAX,假设int的大小为32位(enum通常是1}}。但是类似的东西:

enum foo_t {
   FOO_Start,
   FOO_Thing,
   FOO_Another_Thing,
   FOO_End
};

enum foo_t的类型可以是intunsigned int

但是,枚举常量(例如EVENT_EXITFOO_Start等)属于int类型。这就是你在调试器中看到的。如果您执行类似

的操作
Application_Events foo = EVENT_EXIT;

foo的类型可以是unsigned。我想,这个问题已经改变了一点:

1)对于iPhone,常量0x80000000可能是unsigned(iPhone ARM处理器有32位int s)。它的价值取决于平台和使用的C版本。

2)对于实际情况,您可以假设您的处理器将支持二进制补码算法,因为大多数平台都使用它。然而,C语言本身确实保证。允许使用其他算术方案(补码,有符号幅度)。

答案 3 :(得分:1)

  1. 枚举的类型是int。
  2. 0x80000000只是一个数字,但是以十六进制表示法。它的值是您在调试器中确认的任何值(或任何十六进制到十进制转换器)。
  3. 枚举的工作方式是从任何明确赋值的值中逐步分配值。因此,在这种情况下,枚举被分配为EVENT_EXIT = 0x80000000,EVENT_TOUCH = 0x80000001,EVENT_DRAG = 0x80000002,依此类推。
相关问题