作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为位屏蔽或可能处理位溢出而苦苦挣扎。
我从数据流中获取数据,并将其存储在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/
我是一名优秀的程序员,十分优秀!