64位與32位對無符號型別處理的區別

2021-06-06 09:18:47 字數 790 閱讀 5472

**如下:

char *a = "123456789";

unsigned b = 1;

char *x = a + b; // x: "23456789"

char *y = a - (-b); // y:

如果將上面的**編譯為32位的版本, "a + b" and "a - (-b)" 是相等的,指標 x 和 y 都指向陣列的第二項。看圖1 可更好地理解 "a - (-b)" 的計算過程:

圖  1

但當編譯成 64-bit 程式時, "a + b" 和 "a - (-b)" 是完全不同的值。"-b" 是無符號型別,等於 0xffffffffu。如圖2所示, 指標減去的是0xffffffffu 這個值:

圖   2

在64位系統上會出現訪問超出陣列範圍的錯誤。這類錯誤通常發生在用32位的無符號變數儲存陣列,然後使用負數來引用。下面是個例子:

unsigned index = -1;

array[index] = z;

與前面的情況 一樣, "array[index] = z;" 在 32-bit 環境中正常工作,但在64-bit 情況 下會出錯。

結論:應避免使用無符號資料型別來儲存負值。如果用來引用陣列元素的變數會出現負值,應只使用有符號的資料型別,例如 "int"。或者使用 size_t 和 ptrdfiff_t。

32位與64位下各型別長度對比

64 位的優點 64 位的應用程式可以直接訪問 4eb 的記憶體和檔案大小最大達到4 eb 2 的 63 次冪 可以訪問大型資料庫。本文介紹的是64位下c語言開發程式注意事項。1.32 位和 64 位c資料型別 32和64位c語言內建資料型別,如下表所示 上表中第一行的大寫字母和數字含義如下所示 i...

32位與64位下各型別長度對比

64 位的優點 64 位的應用程式可以直接訪問 4eb 的記憶體和檔案大小最大達到4 eb 2 的 63 次冪 可以訪問大型資料庫。本文介紹的是64位下c語言開發程式注意事項。1.32 位和 64 位c資料型別 32和64位c語言內建資料型別,如下表所示 上表中第一行的大寫字母和數字含義如下所示 i...

32位64位下資料型別

c語言中基本資料型別的長度 32位下 char 1個位元組 不變 指標變數 4個位元組 32位機的定址空間是4個位元組。同理64位編譯器 變化 short int 2個位元組 不變 int 4個位元組 不變 unsigned int 4個位元組 不變 float 4個位元組 不變 double 8個...