C位移位短整数

时间:2010-02-12 16:19:35

标签: c byte

为什么

的结果
include <stdio.h>
int main()
{
    unsigned short int i = 0xff ;
    unsigned short int j;
    j= i<<2;
    printf("%x n%x\n", i, j);
    return 0;
}

是j = 3fc?

如果i和j都是short int - 所以它们是2bytes值,所以j shouldnt = fc ??

提前解释。 〜

6 个答案:

答案 0 :(得分:4)

不,0x3fc是正确的。请注意,一个字节是两个十六进制数字,因此(16位)短数字总共有4个十六进制数字。

答案 1 :(得分:4)

移位0xff左边两位看起来像这样:

    0000 0000 1111 1111
       0    0    f    f

    0000 0011 1111 1100     -- Shifted left 2 bits.
       0    3    f    c

所以0x00ff&lt;&lt; 2 = 0x03fc。一切看起来都应该如此。

答案 2 :(得分:1)

0xff << 2 == 0xff * 4 == 0x3fc == 1020

即使它们是2字节,也可以保留这个小值。

答案 3 :(得分:1)

3FC只需要存储12位,因此可以存储在2个字节中。

答案 4 :(得分:0)

C ++不保证unsigned short int中的字节数。事实上它几乎不能保证char以外的任何类型的大小,保证是1字节。

在这种情况下虽然它无关紧要,因为3fc只能成功存储在2个字节中。

答案 5 :(得分:0)

也许这就是你真正想写的东西? (记住一个十六进制数字只有4位,即半个字节)

#include <stdio.h>
int main()
{
    unsigned short int i = 0xffff;
    unsigned short int j;
    j = i<<8;
    printf("%x  %x\n", i, j);
    return 0;
}

这会输出ffff ff00