C unsigned int数组和位移

时间:2009-11-22 11:35:36

标签: c arrays int bit shift

如果我有一组短无符号整数。

将数组[k + 1]移位8位,将8位放入数组[k + 1]的下半部分?

或者他们只是因为他们已经超出元素的分配空间而退出了?

5 个答案:

答案 0 :(得分:4)

他们下车了。你不能以这种方式影响其他位。试试吧:

#include <stdio.h>

void print_a (short * a)
{
    int i;
    for (i = 0; i < 3; i++)
        printf ("%d:%X\n", i, a[i]);
}

int main ()
{
    short a[3] = {1, -1, 3};
    print_a (a);
    a[1] <<= 8;
    print_a (a);
    return 0;
}

输出

0:1
1:FFFFFFFF
2:3
0:1
1:FFFFFF00
2:3

答案 1 :(得分:3)

它们完全丢弃数据类型,而不是转移到下一个数组元素。

如果你想要那种行为,你必须自己编写类似的东西(左移整个数组四位):

#include <stdio.h>
int main(void) {
    int i;
    unsigned short int a[4] = {0xdead,0x1234,0x5678,0xbeef};

    // Output "before" variables.

    for (i = 0; i < sizeof(a)/sizeof(*a); i++)
        printf ("before %d: 0x%04x\n", i, a[i]);
    printf ("\n");

    // This left-shifts the array by left-shifting the current
    // element and bringing in the top bit of the next element.
    // It is in a loop for all but hte last element.
    // Then it just left-shifts the last element (no more data
    // to shift into that one).

    for (i = 0; i < sizeof(a)/sizeof(*a)-1; i++)
        a[i] = (a[i] << 8) | (a[i+1] >> 8);
    a[i] = (a[i] << 8);

    // Print the "after" variables.

    for (i = 0; i < sizeof(a)/sizeof(*a); i++)
        printf ("after  %d: 0x%04x\n", i, a[i]);

    return 0;
}

输出:

before 0: 0xdead
before 1: 0x1234
before 2: 0x5678
before 3: 0xbeef

after  0: 0xad12
after  1: 0x3456
after  2: 0x78be
after  3: 0xef00

答案 2 :(得分:2)

考虑这一点的方法是在C(和大多数编程语言)中array[k] << 8的实现涉及将数组[k]加载到寄存器中,移位寄存器,然后将寄存器存回数组[K]。因此,数组[k + 1]将保持不变。

例如,foo.c

unsigned short array[5];

void main() {
  array[3] <<= 8;
}

将生成以下说明:

movzwl  array+6(%rip), %eax
sall    $8, %eax
movw    %ax, array+6(%rip)

这会将数组[3]加载到%eax中,修改它并将其存储回来。

答案 3 :(得分:0)

将无符号整数移位8位将使用零填充低8位。前8位将被丢弃,它们在数组中并不重要。

顺便说一下,8位是无符号整数的一半取决于你的系统,但在32位系统上,8位通常是无符号整数的四分之一。

unsigned int x = 0x12345678;
// x is 0x12345678

x <<= 8;
// x is 0x34567800

答案 4 :(得分:0)

请注意,int数据类型的C定义不指定它包含多少位并且取决于系统。 int最初的目的是成为处理器的“自然”字大小,但并不总是这样,你可以发现int包含16,32,64甚至是24位的奇数。

唯一保证的是unsigned int可以保存0到UINT_MAX之间的所有值,其中UINT_MAX必须至少为65535 - 因此int类型必须至少包含16位才能保存所需的值范围。

因此,将整数数组移位8位将分别改变每个int,但请注意,此移位不一定是“数组的一半”