如果我有一组短无符号整数。
将数组[k + 1]移位8位,将8位放入数组[k + 1]的下半部分?
或者他们只是因为他们已经超出元素的分配空间而退出了?
答案 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,但请注意,此移位不一定是“数组的一半”