调用isdigit(c)和isdigit(c&0xFF)有什么区别。屏蔽 isdigit "&0xFF"

问题描述 投票:0回答:2

函数 isdigit 可以用一个字符调用,但是如果我们发送一个带有 255 十进制数的位“&”,我们为什么要这样做。我从 c

中的示例中找到了这个
      const char *value =1234567890abcdefghijklm";
     for(i=0; value[i]; i++)  {
      int r1 = isdigit(value[i]);
      int r2 = isdigit(value[i]&0xFF);
      printf("%d %d\n", r1,r2);

如果我输出上面的我看不出 r1 和 r2 之间的区别

2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
0 0
0 0
0 0
0 0
0 0
0 0
0 0

0 0 0 0 0 0 0 0 0 0 0 0

为什么要用 255(1 字节)来屏蔽这个值?

c bitwise-operators mask
2个回答
0
投票

value[i]
的类型是
const char
,它的实现定义了 char 是有符号还是无符号,但是
isdigit()
技术上需要一个
(unsigned char)
所以你错过了演员表。
value[i] & 0xFF
的类型是
int
并且它需要演员表。
isdigit()
成功返回非零值,因此您打印出的实际值没有任何意义。


0
投票

isdigit
的参数是
int
类型,并且必须等于
EOF
(通常为 -1)或在
unsigned char
的可表示范围内。

如果 plain

char
被签名,那么它可以包含负值,并且将
EOF
以外的负值传递给
isdigit
具有未定义的行为。这意味着将字符串的元素传递给
isdigit
是不安全的。

避免这个问题的通常方法是将参数转换为

unsigned char

int r2 = isdigit((unsigned char)value[i]);

事实上我建议这样做。

使用

0xff
进行按位运算可能具有相同的效果,尽管可能存在一些细微的差异,涉及整数提升和将按位运算应用于有符号类型(我懒得弄清楚)。

做a bitwise and with

0xff
的目的是为了避免在调用
isdigit
时出现未定义的行为。但是转换为
unsigned char
有点干净。

© www.soinside.com 2019 - 2024. All rights reserved.