c - Unsigned int 未给出预期值

标签 c gcc

我正在从一个文件中读取 2 个字节,并尝试使用 unsigned int 作为我的 SVG 输出的 ID。

unsigned int character_name_1;
unsigned int character_name_2;

fread( buffer, sizeof( char ), 4, fpi );
character_name_1=(((buffer[1]<<8)+buffer[0])&0xFFFF);
character_name_2=(((buffer[3]<<8)+buffer[2])&0xFFFF);

如果文件有 2 个值 126 和 128,分别是 0x007E 和 0x0080(buffer[0]=0x7E 和 buffer[1]=0x00),那么,如果我打印到我的 SVG 文件 <g id=%u d=%s></g>",character_name_1, pathdata); ,然后我将 id 正确记录为 'id="126"'。

然而,第二个值是有问题的:<g id=%u d=%s></g>",character_name_2, pathdata);给我以下条目:'id="65408"'

下一个值,它有 2 个字节 0xA0 和 0x00,我希望它是 160,写成 65440。0xA1 和 0x00 应该是 161,但我得到的是 65441。

我希望这是清楚的。

最佳答案

您对 buffer 的定义可能是有符号类型 ( char )。

这导致值 0xA1被插入为负数并调用自动符号扩展(0xA1 -> 0xFFA1),以确保正确处理总和(buffer[3]<<8 + buffer[2])。所以你得到了0xFFA1的值, 即 65441。

将缓冲区更改为 unsigned char将解决您的问题。

关于c - Unsigned int 未给出预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47847836/

相关文章:

可以在 posix_spawn 的 argv 中传递字符串文字吗?

c - 在 C 中读取行并一次读取三个字母

c - 在哪里更改 LD_LIBRARY_PATH

C++98 花括号 const 标量初始化

c - 将指向字符的指针传递给函数

c - 为什么我的可执行文件中的入口点地址是0x8048330? (0x330 是 .text 部分的偏移量)

c - C 中字符串的位置反转

c++ - GCC 允许隐式 int 到指针转换?

c++ - 修改嵌套lambda中捕获的参数 : gcc vs clang?

c++ - 如何在多个架构中将 ccache 与 gcc -march=native 一起使用?