Tôi có một mảng trong C mà tôi muốn xử lý theo cách tương tự như bộ đệm tròn, ví dụ: a[-1]
sẽ trả về phần tử cuối cùng của mảng.Kết quả kỳ lạ của số học modulo với số âm và mẫu số chưa ký
Để làm được điều mà tôi cố gắng sử dụng số học modulo (rõ ràng), vấn đề là, tôi nhận được kết quả khá lạ khi số âm có liên quan đến:
-1 % 4 = -1
-1 % 4U = 3
Cho đến nay, như vậy tốt.
-1 % 4000 = -1
(-1+4000U) % 4000U = 3999
(-1) % 4000U = 3295
Câu hỏi: Giá trị (3295) không giữ cho (a/b)*b + a%b shall equal a, truncated towards zero
(ví a=-1, b=4000
) từ tiêu chuẩn C (6.5.5 # 6) do đó, nó không phải là một lỗi cho mỗi gia nhập, nhưng tại sao là tiêu chuẩn được định nghĩa theo cách này ?! Chắc chắn, phải có một số logic trong việc này ...
Làm cách nào để viết a%b
để nhận kết quả hợp lý cho số âm a
(như (a+b)%b
ngừng hoạt động khi abs(a)>b
)?
thử nghiệm ứng dụng:
#include <stdio.h>
int main(int argc, char **argv) {
int i=0;
#define MAX_NUM 4000U
int weird = (i-1)%MAX_NUM;
printf("%i\n", weird);
printf("%i\n", (i-1+MAX_NUM))%MAX_NUM);
printf("a: %i, b: %i, a from equation: %i\n", i-1, MAX_NUM,
((i-1)/MAX_NUM)*MAX_NUM + weird);
return 0;
}