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

标签 c switch-statement bit standards representation

考虑这个代码示例:

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/

相关文章:

c - 在 C 中解析文件

Java代码、ASCII艺术、switch语句/结构、输入字符然后将其打印在屏幕上

c++ - 检查 switch 语句中的字符串结尾

C - 为什么只有第二个命令有效?

c++ - (b&(1<<i)) VS ((b >> i) & 1) C++

f# - 在 F# 中反转位

c - C 中的另一个反转字符数组

c - cuda c 程序中得到错误的值

计算功率谱密度

c - 在 VS Code 中使用 C++ 和 WSL 用于远程 ARM64 设备