[英]Behavior of unsigned int in C
C中無符號整數的大小為0 to 65,535 or 0 to 4,294,967,295
。
我用C中的以下代碼進行了測試:
unsigned int number = 0;
number -= 300;
printf("%d\n", number);
輸出:-300
我記得如果unsigned int
變量的值低於0,它應該環繞並且我期望輸出類似於4294966996
。 但是從控制台打印的輸出是-300
。
我在C ++中測試了類似的語句,它確實給了我4294966996
。
我的問題是:為什么輸出-300
盡管它是一個unsigned int
?
PS:我查看了幾個標題相似的帖子,但他們沒有解決同樣的問題:
因為printf("%d\\n", number);
即使參數未簽名,也會打印帶符號的值。 使用printf("%u\\n", number);
要正確打印無符號值。
只是@ UniCell的優秀答案背景。
硬件以完全相同的方式存儲int
和unsigned int
。 沒有不同。 如果您開始添加或減去它們,它們將以完全相同的方式溢出和下溢。
0xFFFFFFFF + 1 = 0
0 - 1 = 0xFFFFFFFF
如果我們將結果視為無符號,則0xFFFFFFFF
表示4,294,967,295,否則表示-1。 它被稱為2的補充存儲。 加法和減法是符號無關的。 但乘法和除法不是,所以通常有不同的有符號和無符號機器指令。
這些變量的類型僅為編譯器所知,而不是在運行時。 printf
的參數可以是任何類型,傳遞的變量在運行時不攜帶類型信息。 所以你必須告訴printf
格式字符串如何解釋它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.