我一直在用c編程一段時間。但從來沒有使用整數環繞的程序。我知道如果整數分配4個字節,那麼整數範圍變爲-2,147,483,648至2,147,483,647。如果我們超過了限制,它只是環繞一下。在c中包含整數的部分
我正在使用下面的程序來了解如何環繞發生。
#include <stdio.h>
int main() {
int n = 4, s = 2;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
for (int k = 0; k < n; ++k)
{
s = 2 * s + 1;
}
}
}
printf("%d\n", s);
return 0;
}
我使用gdb來找出變量s所採用的值。我發現當第30次執行最內層循環時,s的值變爲負值,即-1073741825。然後下一次迭代變成2147483647,第32次迭代變成-1。
然後它永遠保持爲-1。我懷疑爲什麼在值變爲-1後沒有發生纏繞。我知道二進制中s的值將全部爲1或FFFFFFFF(十六進制)。它永遠不會改變(內部它正在更新,但我們只能看到最後32位,所以它是-1)。但這次環繞不會進入畫面嗎?它依賴於編譯器嗎?或者,gcc是否只允許環繞一次? 任何形式的幫助,將不勝感激。謝謝
簡短回答:適當的環繞保證*只*爲無符號類型。使用簽名類型,可能會發生奇怪的事情,因爲它在技術上是不確定的。 –
它不再更新,因爲'2 *( - 1)+ 1 = -1'。 –