这道题里面,u-u2的结果4294967264是怎么来的(int占32位)?怎么加模? |
|
10分 |
10 – 42 应该等于 -32,但运算子都是无符,所以溢出,结果等于加模 -32 + 2的32次方
|
请问一下加模是什么意思? |
|
5分 |
有符号数与无符号数之间的转换,都要看要转换的数的最高位是否为1,如果不为1,则转换结果就是要转换的数的本身;如果为1,则转换结果就是转换的数(看作是负数)的补码。
例: char i = -7; -7的原码是:1000 0111,可知最高位为1,因此需要取它的补码,补码为1111 1001,这是一个正数,因此整个数的值就是249。 #include <stdio.h> 2 3 int main(void) 4 { 5 char i = -7; 6 7 printf("%u\n",(unsigned char)i); 8 9 return 0; 10 } 输出为249 |
我的理解是:模 英文简写 mod,意思是求余,当将有符号值转无符号时,因为位的表示方法不同(有符号最高位表示符号位),所以有2种情况,如果值大于等于0,值是相等的,如果小于0,就要将该值对(所占位数能表示的最大无符号数)求余,举例 signed char a = 9; 换成无符还是9,如果a = -9, 那么(-9 % 256(char 的无符号类型所能表示的最大值+1))的余数就是对应的值,负数的求余,我们可以将被除数 -9 不停的加 除数 256,一直加到被除数变成正值且小于除数,也就是246, 对256求余也是 246,最后求余的一步可以省略,因为商等于0,余数等于被除数,前面 -9 不停加的过程,称为加模 |
|
5分 |
自己手算的话,先将32写为二进制,然后取反加1即可,结果等于2^32-32
|
谢谢! |