gpt4 book ai didi

c - 为什么使用 0xff 对字符进行按位与运算?

转载 作者:行者123 更新时间:2023-12-04 11:06:36 25 4
gpt4 key购买 nike

我正在阅读一些实现简单解析器的代码。一个名为 scan 的函数将一行分解为标记。 scan有一个静态变量 bp指定要标记化的行。在分配之后,空格被跳过。见下文。我不明白的是为什么代码对 bp 的字符进行了逐位处理。指向与 0xff ,即 * bp & 0xff 的目的是什么?这怎么样:

while (isspace(* bp & 0xff))
++ bp;
与此不同:
while (isspace(* bp))
++ bp;
这是 scan功能:
static enum tokens scan (const char * buf)
/* return token = next input symbol */
{ static const char * bp;

while (isspace(* bp & 0xff))
++ bp;

..
}

最佳答案

来自 C 标准(7.4 字符处理 )

1 The header <ctype.h> declares several functions useful forclassifying and mapping characters.198) In all cases the argument isan int, the value of which shall be representable as an unsignedchar or shall equal the value of the macro EOF. If the argument hasany other value, the behavior is undefined.


在这次通话中
isspace(* bp)
参数表达式 *bp具有类型 char转换为类型 int由于整数促销。
如果类型 char表现为类型 signed char以及表达式 *bp 的值为负,则类型为 int 的提升表达式的值is 也将为负数且不能表示为类型 unsigned char 的值.
这会导致未定义的行为。
在这次通话中
isspace(* bp & 0xff)
由于按位运算符和表达式的结果值 * bp & 0xff类型 int可以表示为 unsigned char 类型的值.
所以这是一个使用技巧,而不是编写更清晰的代码,例如
isspace( ( unsigned char )*bp )
函数 isspace通常以这样一种方式实现,即它使用其类型为 int 的参数。作为具有 256 个值(从 0 到 255)的表中的索引。如果类型为 int 的参数具有大于最大值 255 的值或负值(并且不等于宏 EOF 的值),则函数的行为未定义。

关于c - 为什么使用 0xff 对字符进行按位与运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67677638/

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