本篇博客记录我在阅读《C++ Primer》P33面遇到的一个小问题:
unsigned char c = -1; 最后c取得的结果为255。给的解释是:-1 % 256 = 255
我的疑问是:为什么-1 mod 256 会是 255 呢?
然后我VS Studio上运行了一段测试代码
int a = -7;
int b = 4;
int c = a / b;
int d = a % b;
cout << "c : " << c << endl; // 结果: -1
cout << "d : " << d << endl; // 结果: -3
这一点比较符合我的想法。
然后对于无符号数又有不同,无符号数取模值为(-7 + n * 4)% 4 ,n为保证让(-7 + n*4)为正数的最小值,在本处就是n=2满足(4 * 2 - 7)= 1, 就是1 % 4 = 1。
unsigned int a = -7;
unsigned int b = 4;
int c = a / b;
int d = a % b;
cout << "c : " << c << endl; // 1073741823
cout << "d : " << d << endl; // 1
至于为什么无符号数在取余时会出现“乱码”,是因为将无符号数赋值为负数,在内存中保存为一串“乱码”,对它取余本来就不成立吧。
------ 一段时间后的思考--------
int数据类型为32位比特,因此a = 2^32 - 7 = 4,294,967,289,
因此c = 4,294,967,289 / 4 = 1,073,741,823
大功告成!