- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
enum Some_Flag {
SOME_FLAG_A = 0x00000000u,
SOME_FLAG_B = 0x00000001u,
SOME_FLAG_C = 0x00000002u,
/* ... */
SOME_FLAG_Z = 0x80000000u,
};
uint32_t a;
a = SOME_FLAG_Z;
假设 32 位整数...这在 C 中有效吗?
这个标准对我来说似乎模棱两可。
编辑:
引用标准:
6.4.4.3 Enumeration constants
Semantics
2 An identifier declared as an enumeration constant has type int. Forward references: enumeration specifiers (6.7.2.2).
6.7.2.2 Enumeration specifiers
Constraints
2 The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
Semantics
3 The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.127) An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no =, the value of its enumeration constant is 0. Each subsequent enumerator with no = defines its enumeration constant as the value of the constant expression obtained by adding 1 to the value of the previous enumeration constant. (The use of enumerators with = may produce enumeration constants with values that duplicate other values in the same enumeration.) The enumerators of an enumeration are also known as its members.
4 Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined,128) but shall be capable of representing the values of all the members of the enumeration. The enumerated type is incomplete until immediately after the } that terminates the list of enumerator declarations, and complete thereafter.
约束似乎清楚地表明枚举是一个整数,但 6.7.2.2_4 似乎允许无符号整数 ¿?
最佳答案
您的代码无效:
C90(6.5.2.2,枚举说明符):
Constraints
The expression that defines the value of an enumeration constant shall be an integral constant expression that has a value representable as an
int
.
C99(在 C11 草案中未更改)(6.7.2.2,枚举说明符):
Constraints
- The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an
int
.
您的值超出了 32 位 int
的范围,因此这是一个错误(需要进行诊断)。
请注意,这完全是关于枚举常量的“初始化器”。例如,如果我们有
enum foo { BAR = 42u };
然后这个约束说明值 42u
必须能够放入 int
(确实如此;它只是一个无符号的 42,而 42 适合一个 int
).
BAR
本身的类型是int
(令人惊讶的是,不是enum foo
)。
但是如果你声明一个类型为 enum foo
的变量,那么它的大小和符号是实现定义的。它将基于一些现有的整数类型(可以存储所有枚举值),但实际使用的类型可能因实现而异(以及不同的 enum
类型)。
关于枚举可以容纳大于 INT_MAX 的无符号整数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53681947/
我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 INT_MAX * INT_MAX 溢出,但我不确定为什么这会在 C/C++ 中给出乘积 1。 #include #include int m
我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 INT_MAX * INT_MAX 溢出,但我不确定为什么这会在 C/C++ 中给出乘积 1。 #include #include int m
我的印象是 INT_MAX 将打开 int 的所有 32 位。如果我否定它并与它本身“和”,我应该将全 0 与全 1 进行比较并返回 false。我错过了什么? int x = INT_MAX; x
我想解决一些关于溢出的问题。我有一些数据使用int来存储,数据不会导致溢出但计算中间可能会导致溢出。 比如我需要存储正方形的对角线,边长是50000,所以对角线是70710,边和对角线都远小于INT_
enum Some_Flag { SOME_FLAG_A = 0x00000000u, SOME_FLAG_B = 0x00000001u, SOME_
如何在 C 语言中仅使用按位运算符获取 INT_MAX 的值?我希望 ~0 为 1111111111(1 的补码,所以十进制 -1)和 ~ 0 >> 1 为 0111111111,这将是最大值,但它仍
我在/usr/include/limits.h 中找到了以下定义: #define INT_MIN (-INT_MAX - 1) #define INT_MAX 2147483647 此外,似乎此头文
下面是一段代码,用于检查给定数字是否为 Lychrel 数字。这基本上意味着该程序取一个数及其倒数之和,然后取那个数及其倒数之和,等等,直到找到回文。如果它在一定的迭代次数内没有找到这样的数字(我在这
我在做逆向工程的时候遇到了宏INT_MAX,但是找不到它的值。那么预处理器如何知道它的值呢? 最佳答案 如果你#include (或 C++ 中的 )然后 INT_MAX保证被定义。 它是否真的出现
我的 C 程序执行“Turmrechnung”(预定义的数字(“init_num”乘以预定义的数字范围(init_num*2*3*4*5*6*7*8*9 在我的例子中,由变量“h”定义),然后除以那些
从昨天开始,我一直试图在链表中找到最小的两个数字,但仍然无法做到,所以决定在 stackoverflow 上提问。 我这样做的逻辑是: (1) 首先设置min1->freq和min2->freq为IN
我得到了这段代码: char a[151]; scanf ("%150s", a); 在a可能是一个数字,如果是这样,我需要确定,如果 a INT_MAX) Overflow(); // gr
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
如果我尝试应用:Integer.valueOf(String.valueOf(Integer.MAX_VALUE) + "9"); 我得到一个 NumberFormatException。 但我需要从
在 C++ 中,有符号类型的溢出是未定义的行为。以下示例是否也是未定义的行为? #include int f() { int a = INT_MAX; int b = -1; retur
这个问题已经有答案了: Why is unsigned integer overflow defined behavior but signed integer overflow isn't? (7
嗯,我觉得我的问题比其他问题更复杂一些。我在尝试解决这个问题时意识到了这一点。 我尝试使用 int number = rand() % (INT_MAX - INT_MIN + 1) + INT_MI
为什么这段代码不会产生编译时错误? INT_MAX 是一个宏,它保存可以存储在 int 中的最大值,但是 minVal 没有声明,当我打印它时,它会产生 0 的值。我正在使用 c99 进行编译。 #i
这个问题在这里已经有了答案: for every int x: x+1 > x .... is this always true? (4 个答案) 关闭 9 年前。 for (i = 0; i <=
我从用户输入中得到 long(使用 fgets() 并使用 strtoul() 转换为 long),但是在测试它以转换为整数时给出错误的结果. 声明: char buf[BUFSIZE]; unsig
我是一名优秀的程序员,十分优秀!