Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
十六进制表达式0x8000000在C语言的枚举声明中是什么意思_C_Xcode_Objective C 2.0 - Fatal编程技术网

十六进制表达式0x8000000在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

我正在阅读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;
我不明白这些事件被赋予了什么样的价值。
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