这是:
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;
答案 0 :(得分:2)
UIImageView
答案 1 :(得分:1)
由于Site
具有负值,
a
导致未定义的行为。
从C99标准(强调我的):
6.5.7按位移位运算符
4
unsigned int c = a << 16 | b;
的结果是E1 << E2
左移E1
位位置;腾出的位用零填充。如果E2
具有无符号类型,则结果的值为E1
xE1
2
,减去的模数比可表示的最大值减1在结果类型中。如果E2
具有签名类型和非负值,并且E1
xE1
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中获得了一个非常不同的数字。
存储两个正数可以解决这个问题....但你可能需要存储一个负数。