-1 mod 256 = 255 (數學標準定義 / Python / Ruby / Lua / Google Calculator 等)
-1 % 256 = -1 (C / C++ / Java / JavaScript / C# / Go 等採用截除取餘)
滿足同餘關係:a ≡ b (mod m) ⟺ m | (a - b)
[0, m-1] (非負)-1 ≡ 255 (mod 256) 因為 256 | (-1 - 255) = -256(a + km) mod m = a mod m兩主流標準:
| 標準 | 公式 | 特點 | 代表語言 |
|---|---|---|---|
| 截除取餘 | r = a - (a/b)*b (向零截斷) | 結果符號同被除數 | C99, Java, JS, C#, Go |
| 向下取整 | r = a - floor(a/b)*b | 結果符號同除數 (非負) | Python, Ruby, Lua, Perl |
// C/C++ (C99 標準)
-1 % 256 // -1
// Java
-1 % 256 // -1
Math.floorMod(-1, 256) // 255 (Java 8+ 提供數學模運算)
// JavaScript
-1 % 256 // -1
((-1 % 256) + 256) % 256 // 255 (通用修正公式)
// Python
-1 % 256 // 255
divmod(-1, 256) // (-1, 255) 商向下取整
// C#
-1 % 256 // -1
Math.FloorMod(-1, 256) // 需 .NET 7+ 或自行實現
// Java
public static int mod(int a, int m) {
int r = a % m;
return r < 0 ? r + m : r;
}
// JavaScript
const mod = (a, m) => ((a % m) + m) % m;
// C/C++
int mod(int a, int m) {
int r = a % m;
return r < 0 ? r + m : r;
}
// Go
func Mod(a, m int) int {
r := a % m
if r < 0 { r += m }
return r
}
// 僅當 m = 2^n 時有效
// -1 & 0xFF = 255 (等同於 -1 mod 256)
int fastMod = (a & (m - 1)); // m 必須是 2 的冪次
// 原理:二進制補碼中,取模 2^n 等價於保留低 n 位
// 寫入指針遞增
writeIndex = (writeIndex + 1) % BUFFER_SIZE;
// 讀取指針遞增
readIndex = (readIndex + 1) % BUFFER_SIZE;
// 使用數學模運算確保索引始終在 [0, BUFFER_SIZE-1]
int bucket = Math.floorMod(key.hashCode(), table.length);
// 避免負索引導致 ArrayIndexOutOfBoundsException
// 將任意角度標準化到 [0, 360)
angle = ((angle % 360) + 360) % 360;
// 或使用數學庫
angle = Math.floorMod(angle, 360);
MOD(-1, 256) = 255,PostgreSQL -1 % 256 = -1,Oracle MOD(-1, 256) = 255rand() % n 產生負數導致數組越界 (C/C++ 常見 Bug)MathUtil.mod()& (m-1)% 操作是否處理負數情況