十六进制表达式0x8000000在C语言的枚举声明中是什么意思
我正在阅读iPhone示例项目(Xcode IDE,Apple LLVM编译器4.2)的代码。在该iPhone示例项目的外部库(用C编写)的头文件中,枚举类型中声明了一些事件:十六进制表达式0x8000000在C语言的枚举声明中是什么意思,c,xcode,objective-c-2.0,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
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;
我不明白这些事件被赋予了什么样的价值。0x8000000
应该是一个大的正整数(2147483648
),还是负零或负整数(-2147483648
)
我在Xcode调试器中进行了检查,编译器是Apple LLVM compiler 4.2,EVENT\u EXIT
等于(int)-2147483648
和EVENT\u RELEASE\u TOUCH
等于(int)-2147483645
等等
很明显,他们被当作代表来对待。可以找到相关的帖子
但我现在不确定的是:
(1) 0x8000000
的底层数据类型始终是int
还是其他情况下的其他类型?这取决于编译器还是平台
(2) 如果我将一个十六进制值赋给这样一个有符号整数,它是否总是被解释为二者的补码表示?这取决于编译器还是平台?可以找到相关的帖子。可以找到另一个参考
请分享一些想法。谢谢大家:D枚举的基本类型是实现定义的。在这种情况下,基类型应该是
unsigned int
,因为标准要求编译器选择足够宽的基类型来容纳所有枚举值。根据C99标准第6.7.2.2.4节:
每个枚举类型应与char
、有符号整数类型或无符号整数类型兼容。类型选择由实现定义(108),但应能够表示枚举的所有成员的值。在终止枚举器声明列表的}
之后,枚举类型才是不完整的
108)实现可能会延迟选择哪种整数类型,直到看到所有枚举常量
枚举的基类型由实现定义。在这种情况下,基类型应该是
unsigned int
,因为标准要求编译器选择足够宽的基类型来容纳所有枚举值。根据C99标准第6.7.2.2.4节:
每个枚举类型应与char
、有符号整数类型或无符号整数类型兼容。类型选择由实现定义(108),但应能够表示枚举的所有成员的值。在终止枚举器声明列表的}
之后,枚举类型才是不完整的
108)实现可能会延迟选择哪种整数类型,直到看到所有枚举常量
像C语言中的许多东西一样,枚举只是一个整数。这样设置第一个值将导致编译器从那里开始递增,从而确保所有枚举值都小于0。(作为2s互补的有符号整数,设置的高位将表示负数) 很可能,程序员选择此值是为了能够发送各种事件,并且不应该与其他事件冲突
简而言之,不要担心实际价值;这只是一个数字。使用名称并理解它在使用或返回这些代码的调用上下文中的含义。与类似C语言中的许多内容一样,枚举只是一个整数。这样设置第一个值将导致编译器从那里开始递增,从而确保所有枚举值都小于0。(作为2s互补的有符号整数,设置的高位将表示负数) 很可能,程序员选择此值是为了能够发送各种事件,并且不应该与其他事件冲突
简而言之,不要担心实际价值;这只是一个数字。使用名称并理解它在使用或返回这些代码的调用上下文中的含义。枚举的基本类型取决于它需要保留的值。编译器在如何最终定义该类型上有一定的自由度。在您的情况下,
Application\u Events
的基本类型可能是unsigned int
,因为它大于int\u MAX
,假设int
的大小为32位(通常是enum
的大小)。但有点像:
enum foo_t {
FOO_Start,
FOO_Thing,
FOO_Another_Thing,
FOO_End
};
enum foo\u t
的类型可以是int
或unsigned int
但是,枚举常量(例如,EVENT\u EXIT
,FOO\u Start
等)的类型为int
。这就是你在调试器中看到的。如果你这样做
Application_Events foo = EVENT_EXIT;
foo
的类型可以是unsigned
。我认为这个问题有点变化,所以:
1) 对于iPhone,常量0x8000000
可能是无符号的
(iPhone ARM处理器具有32位int
s)。它的价值取决于平台和使用的C版本
2) 实际上,您可以假设您的处理器将支持2的补码算法,因为大多数平台都使用它。然而,C语言本身并不能保证这一点。允许使用其他算术方案(1的补码、有符号的大小)。枚举的基本类型取决于它需要保持的值。编译器在如何最终定义该类型上有一定的自由度。在您的情况下,
Application\u事件的基本类型很可能是unsigned int
,因为它大于int\u MAX