3
A
回答
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
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
0
移位一个由8位剩下的无符号整数将用零填充低8位。前8位将被丢弃,它们在数组中并不重要。
顺便提一下,8位是无符号整数的一半取决于您的系统,但在32位系统上,8位通常是无符号整数的四分之一。
unsigned int x = 0x12345678;
// x is 0x12345678
x <<= 8;
// x is 0x34567800
0
请注意,int数据类型的C定义没有指定它包含的位数,并且依赖于系统。一个int最初是为了处理器的“自然”字大小,但这并不总是如此,你可以发现int包含16,32,64甚至一些奇数如24位。
唯一保证的是无符号整数可以包含0和UINT_MAX之间的所有值,其中UINT_MAX必须至少为65535 - 所以int类型必须包含至少16位以保存所需的值范围。
因此,通过8个比特移位整数的阵列将改变每个单独INT,但请注意,这种转变将不一定是
2
考虑这个问题的方法“的阵列的一半”是,在C(对于大多数编程语言),array[k] << 8
的实现涉及将数组[k]加载到寄存器,移位寄存器,然后将寄存器存回数组[k]。因此array [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中,修改它,并将其存储回。
相关问题
- 1. C++和 - (无符号整型)
- 2. 无符号整数位字段移产量符号整数
- 3. C#无符号整型96位
- 4. 无符号16位和64位整数
- 5. 按位不是有符号整数和无符号整数在C
- 6. C#Marshal.Copy Intptr到16位管理无符号整数数组
- 7. “Int”和“无符号整型”
- 8. Borland C/C++无符号整型缩写
- 9. C - 签名和无符号整数
- 10. sqlite C++和无符号整数操作
- 11. 移位N位整个字符数组
- 12. 32位无符号整数的2位右移
- 13. C++中无符号和无符号整数之间的区别
- 14. 无符号long long型按位移
- 15. 在javascript中使用无符号32位整数进行位移/类型转换?
- 16. C++算术类型转换与无符号&符号整数
- 17. C++有符号整数转换为无符号位数更多位
- 18. 向右移位并有符号整数
- 19. 带符号和无符号整数的位操作问题,XNOR
- 20. 有符号和无符号整数?
- 21. 无符号和符号整数
- 22. 将无符号整数右移UB的总位数?
- 23. 从无符号长整型转换为无符号整型
- 24. C scanf无符号长整型值
- 25. 无符号整型转换C++
- 26. 在C++中无符号整型促销
- 27. 从无符号整数计数位
- 28. 执行有符号和无符号整数的区别C++
- 29. 用在字符数组存储的无符号整数用C
- 30. 在无符号整数和有符号整数之间进行C++转换
你是不是指'把数组[k]左移? – 2009-11-22 11:56:28