Unsigned int未给出预期值

时间:2017-12-16 16:40:01

标签: 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(缓冲区[0] = 0x7E,缓冲区[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。

我希望这很清楚。

3 个答案:

答案 0 :(得分:2)

您对buffer的定义可能是签名类型(char)。

这会导致值0xA1作为负数进行互动,并调用自动符号扩展(0xA1 - &gt; 0xFFA1),以确保总和({{1} }})正确处理。所以你得到buffer[3]<<8 + buffer[2]的值,即65441。

将缓冲区更改为0xFFA1将解决您的问题。

答案 1 :(得分:1)

Array ( [0] => 101 [1] => 102 [2] => 103 [3] => 104 [4] => 105 [5] => 106 [6] => 107 [7] => 108 ) 声明为bufferchar。将其更改为signed char

由于您unsigned char中的元素已签名,因此您的表达式中会显示负值。

答案 2 :(得分:-1)

从你的问题中不太清楚,假设缓冲区是字符或字符指针的数组。我认为以下改变应该有效:

character_name_1=(((buffer[1]<<8)+buffer[0])&0xFF);
character_name_2=(((buffer[3]<<8)+buffer[2])&0xFF);