C++无符号数、带符号数的计算

C++语言 码拜 7年前 (2015-07-10) 641次浏览 0个评论
 

这道题里面,u-u2的结果4294967264是怎么来的(int占32位)?怎么加模?C++无符号数、带符号数的计算

10分

10 – 42 应该等于 -32,但运算子都是无符,所以溢出,结果等于加模 -32 + 2的32次方
 
引用 1 楼 stephen_w__的回复:

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

 
引用 2 楼 String_Spring 的回复:
Quote: 引用 1 楼 stephen_w__的回复:

10 – 42 应该等于 -32,但运算子都是无符,所以溢出,结果等于加模 -32 + 2的32次方

请问一下加模是什么意思?

我的理解是:模 英文简写 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
 
引用 4 楼 stephen_w__ 的回复:
Quote: 引用 2 楼 String_Spring 的回复:
Quote: 引用 1 楼 stephen_w__的回复:

10 – 42 应该等于 -32,但运算子都是无符,所以溢出,结果等于加模 -32 + 2的32次方

请问一下加模是什么意思?

我的理解是:模 英文简写 mod,意思是求余,当将有符号值转无符号时,因为位的表示方法不同(有符号最高位表示符号位),所以有2种情况,如果值大于等于0,值是相等的,如果小于0,就要将该值对(所占位数能表示的最大无符号数)求余,举例 signed char a = 9; 换成无符还是9,如果a = -9, 那么(-9 % 256(char 的无符号类型所能表示的最大值+1))的余数就是对应的值,负数的求余,我们可以将被除数 -9 不停的加 除数 256,一直加到被除数变成正值且小于除数,也就是246, 对256求余也是 246,最后求余的一步可以省略,因为商等于0,余数等于被除数,前面 -9 不停加的过程,称为加模
好啰嗦的感觉…这么解释能明白吗….

谢谢!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++无符号数、带符号数的计算
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!