c - 位掩码 (char)(0xFFFFFFB8 & 0xFF) 在 c 中不起作用

标签 c bit-manipulation

我正在为位屏蔽或可能处理位溢出而苦苦挣扎。

我从数据流中获取数据,并将其存储在char 类型的缓冲区中,我需要访问缓冲区的特定索引。当我尝试这样做时,我得到了意想不到的结果。

类似下面的内容..

char buffer[BUFFER_SIZE];

/* ...recv from network stream performed... */

printf("buffer[index] = 0x%x\n", buffer[index]); /* => 0xFFFFFFB8 */

char dummyChar = buffer[index] & 0x000000FF;
printf("dummyChar = 0x%x\n", dummyChar); /* => 0xFFFFFFB8 */

缓冲区是char 类型。为什么我在打印 buffer[index] 时得到的是 32 位大小?

我还用 0x000000FF 屏蔽了 buffer[index],但我仍然得到 0xFFFFFFB8。为什么?

我只想得到0xB8,谁能告诉我怎么做?我很确定它是 1 字节大小..

最佳答案

有两个原因:第一个是当传递小于 int 的整数类型时,它会自动提升为 int(可能对值进行符号扩展)。第二个原因是因为 printf格式 "%x" 用于打印 unsigned int 值,而不是字节。

对于 unsigned 字节(unsigned char),您应该使用修饰符 hh,如 中一样%hhx”。那么printf将知道传递的值实际上是单个无符号字节而不是完整的 unsigned int

有关详细信息,请参阅上面的链接引用。

关于c - 位掩码 (char)(0xFFFFFFB8 & 0xFF) 在 c 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39719866/

相关文章:

c - 从 execv 运行 mysql 导入

c - 此代码如何反转数字中的位?

c - 在 C 中屏蔽一点返回意外结果

c++ - 双与位运算的算术

c - 如何更改 uint32_t 变量中单个字节的值?

c - 需要声明不相关的字符数组以避免程序卡住

指针与整数比较错误

c - 在 C 中标记 URL

c - 如何交换单位矩阵的第一行和最后一行?

c - 判断 32 位有符号整数是否为 2 的幂