gpt4 book ai didi

c - C 标准关于 switch 语句的描述

转载 作者:太空狗 更新时间:2023-10-29 15:41:18 27 4
gpt4 key购买 nike

考虑这个代码示例:

char c = 0xff;
char mask = 0xfe;
switch ((unsigned)(c & mask)) {
case -2: /* do task 1 */ break;
default: /* do task 2 */
}

让我们假设 CHAR_BIT = 8 并且实现定义的对 c 和掩码的分配是通过位模式的解释:11111111 和 11111110,并且允许负零。因此,这段代码的行为是:

如果 char 是有符号的并且实现使用 2 的补码,c = -1, mask = -2, c & mask = -2, (unsigned)(c & mask) = UINT_MAX - 1

如果 char 有符号并且实现使用 1 的补码,c = 0, mask = -1, c & mask = 0, (unsigned)(c & mask) = 0c 是零而不是负零,因为 C 不允许通过赋值创建负零。

如果 char 是有符号的并且实现使用有符号的量级,c = -127, mask = -126, c & mask = -126, (unsigned)(c & mask) = UINT_MAX - 125

如果 char 是无符号的 c = 255, mask = 254, c & mask = 254, (unsigned)(c & mask) = 254

大小写常量 -2 被转换为与控制表达式相同的类型,因此值为 UINT_MAX - 1。因此,只有当 char 被签名并且实现使用 2 的补码时,它才会匹配。

根据 C 标准,这是正确的还是需要添加额外的假设?

最佳答案

Is this correct according to the C standard

不是真的。如果 char 是带符号的 8 位(即 CHAR_MAX 小于 255),则行

char c = 0xff;

是实现定义的。它可能会按照您说的去做,但也可能不会。

C 标准 6.3.1.3:

Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.

关于c - C 标准关于 switch 语句的描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8062669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com