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. C#無符號整型96位
- 3. 無符號16位和64位整數
- 4. 「Int」和「無符號整型」
- 5. Borland C/C++無符號整型縮寫
- 6. 移位N位整個字符數組
- 7. 無符號long long型按位移
- 8. C++算術類型轉換與無符號&符號整數
- 9. 向右移位並有符號整數
- 10. 帶符號和無符號整數的位操作問題,XNOR
- 11. 從無符號長整型轉換爲無符號整型
- 12. C scanf無符號長整型值
- 13. 在C++中無符號整型促銷
- 14. 執行有符號和無符號整數的區別C++
- 15. 在無符號整數和有符號整數之間進行C++轉換
- 16. 將無符號字符(數組)轉換爲無符號整數(數組)
- 17. 8位無符號字符數組到無符號字符
- 18. 位移爲32個64的無符號整數
- 19. 無符號整數的反向位
- 20. Javascript中的無符號32位整數
- 21. pymongo 64位無符號整數
- 22. C++:在一個有符號的64位整數中的兩個無符號64位整數的差異
- 23. 數組索引的類型:有符號/無符號整數優點
- 24. 無符號整數
- 25. 如何實現無符號33位整數類型
- 26. C++跨平臺方式來定義64位無符號整數
- 27. 如何清零C無符號整數的底部n位?
- 28. 從C#流中讀取一個無符號的24位整數
- 29. 使用64位有符號值在SQL和C#中模擬128位無符號整數?
- 30. 將4位8位無符號整數轉換爲32位浮點型
你是不是指'把數組[k]左移? – 2009-11-22 11:56:28