在一个unsigned int中存储2个签名短裤

时间:2016-12-09 16:21:51

标签: c

这是:

signed short a, b;
a = -16;
b = 340;

现在我想将这两个签名的短裤存储在一个unsigned int中,然后再次检索这两个签名的短裤。我试过这个,但结果短裤不一样了:

unsigned int c = a << 16 | b;

signed short ar, br;
ar = c >> 16;
br = c & 0xFFFF;

4 个答案:

答案 0 :(得分:2)

OP几乎是正确的

UIImageView

答案 1 :(得分:1)

由于Site具有负值,

a

导致未定义的行为。

从C99标准(强调我的):

  

6.5.7按位移位运算符

     

4 unsigned int c = a << 16 | b; 的结果是E1 << E2左移E1位位置;腾出的位用零填充。如果E2具有无符号类型,则结果的值为E1 x E1 2 ,减去的模数比可表示的最大值减1在结果类型中。如果E2具有签名类型和非负值,并且E1 x E1 2 在结果类型中可表示,则结果为值; 否则,行为未定义。

您可以明确地将E2转换为signed short以获得可预测的行为。

unsigned short

输出:

#include <stdio.h>

int main()
{
   signed short a, b;
   a = -16;
   b = 340;

   unsigned int c = (unsigned short)a << 16 | (unsigned short)b;

   signed short ar, br;
   ar = c >> 16;
   br = c & 0xFFFF;

   printf("ar: %hd, br: %hd\n", ar, br);
}

答案 2 :(得分:0)

这真的很奇怪,我已经编译了你的代码,它对我有用 也许这是未定义的行为,我不确定,但是如果我是你 我添加了强制转换,以明确避免因滥用两个补码或编译器自动转换而导致的一些损失......

在我看来,发生的事情可能就是你把所有的东西都移出去了 a ...试试这个

unsigned int c = ((unsigned int) a) << 16 | b;

答案 3 :(得分:-1)

这是因为您使用的是无符号整数,通常为32位,负符号短整数通常为16位。 当你将带有负值的short放入unsigned int时,那就是&#34; negative&#34; bit将被解释为正数的一部分。 所以你在unsigned int中获得了一个非常不同的数字。

存储两个正数可以解决这个问题....但你可能需要存储一个负数。