我可以猜測後者明確指出要處理'1'作爲無符號整數。但是如果前者有什麼壞的副作用的話。我看到這兩個在linux內核中都有使用。那麼哪一個更準確/推薦,爲什麼?宏定義b/n有什麼區別:'#define my_macro(1 << 16)'和'#define my_macro(1U << 16)'
0
A
回答
3
1 << x
的一個問題變得很明顯,當您將1移到左側足夠遠時。在具有二進制補碼錶示整數的機器上,這會使值突然變爲負值。假設一個int
寬度的32位:
#include <stdio.h>
int
main(int argc, const char** argv)
{
printf("%d\n", (1 << 30));
printf("%d\n", (1 << 31));
printf("%ud\n", (1U << 30));
printf("%ud\n", (1U << 31));
return 0;
}
我的機器上產生
1073741824
-2147483648
1073741824d
2147483648d
。這在代碼的其他部分可能是意想不到的。特別是,作爲反向移位不一定是等效的,因爲符號的擴展:
#include <stdio.h>
int
main(int argc, const char** argv)
{
printf("%d\n", (2 << 29) >> 29);
printf("%d\n", (2 << 30) >> 30);
printf("%u\n", (2U << 29) >> 29);
printf("%u\n", (2U << 30) >> 30);
return 0;
}
產生
2
-2
2
2
通知他翻轉所述第二輸出線標誌...
1
這取決於你正在運行的系統。
如果它是一個整數是16位的系統,那麼(1 < < 16)將「離開邊緣」並且數字將爲0.在32位系統上,數字將是2^16(65536)。
由於shift是16,所以如果1是無符號的,它真的沒關係。
但是,如果移位是15,那麼它會更復雜:
無符號的16位整數在移位後的值爲2^15(32768),而有符號的16位整數會具有二進制補碼錶示中的值-2^15(-32768)。
相關問題
- 1. 說明1 << 16 | 10?
- 2. (1U << X)做什麼?
- 3. <?php,<?, <?=,有什麼區別?
- 4. 這是什麼「的#define BLABLABLA(1 << 2)平均
- 5. 「1000 << 16」中的「<<」是什麼意思?
- 6. 爲什麼<< 256 :: size(16)>>目前爲<<1, 0>>?
- 7. <?有什麼區別? echo __();和<= __();
- 8. <?有什麼區別?和<?php
- 9. <%# %>和<%= %>有什麼區別?
- 10. <%:和<%=和<%#在aspx中有什麼區別?
- 11. define('MENU_IS_ROOT',0x0001)和define('MENU_IS_ROOT',1)之間有什麼區別?
- 12. <?或<?php ---有什麼區別?
- 13. 在ASP.NET WebForms中,<%:, <%=和<%#之間有什麼區別?
- 14. cout << cout和cout <<&cout在C++中有什麼區別?
- 15. 什麼意思是「:」在<%中:和<%=有什麼區別?
- 16. 在ASP.NET MVC之間有什麼區別「<%=」,「<%:」「<%#」
- 17. 是否有在這種情況下,鑄件的問題,如果((X +(Y << 16))==( '一個' +( 'B' << 16)))
- 18. (1 << 32)和(1 << i)之間的區別其中i == 32
- 19. 區別<p>是什麼Javascript和ASP.net有什麼區別?</p>
- 20. 如何(我<< 48)| ((i&0xffff0000L)<< 16) | ((i > >> 16)&0xffff0000L)| (i >>> 48)工作?
- 21. < - 和=在data.frame中有什麼區別?
- 22. C近拍建築,我無法得到這個宏expanison權</p> <pre><code>#define foo Hello #ifdef foo #define wrapper(x) foo ## x #else #define wrapper(x) boo ## x #endif </code></pre> <p>調用定義
- 23. <16 API中的TextView.getMinHeight()
- 24. while(++ i < - j)&while(i ++ <j--)有什麼區別?
- 25. List <Something>和List <?有什麼區別?擴展Something>?
- 26. XSLT:<copy-of>和<apply-templates>有什麼區別?
- 27. <?有什麼區別?擴展Object>和<E extends Object>?
- 28. ASP.NET MVC中的<%:和<%=有什麼區別?
- 29. HashSet <T>和List <T>有什麼區別?
- 30. 列表<string>和IEnumerable <String>有什麼區別?
如果你需要實現字節算術,總是使用'unsigned'類型。例如'1字節'使用'unsigned char'。 – triclosan