对于计算机中补码的运算(无符号类型)

int main()
{
	unsigned char i = 7;
	int j = 0;
	for (; i > 0; i -= 3)
	{
		++j;
	}
	printf("%d", j);
	return 0;
}

对于这段代码大家可能觉得答案为 3

但是不是的

大家可能会忽略,i是一个无符号整型

计算机中的运算是以补码形式运算的

所以输出结果为173

第一步: 7进来,j=1

i-3=4,j=2

i-3=1,j=3

接下得到i=-2,但是不要忘了i不能等于负数2

-2 :

原码1000 0000 0000 0000 0000 0000 0000 0010

反码1111 1111 1111 1111 1111 1111 1111 1101

补码1111 1111 1111 1111 1111 1111 1111 1110

char只占一个字节所以取2后八位1111 1110

所以此时-2在计算机中表示的是254

254里面有84个3,余下了2,2-3又得到-1(255)

此时已经等于3+84=87

-1:

原码 1000 0000 0000 0000 0000 0000 0000 0001

反码 1111 1111 1111 1111 1111 1111 1111 1110

补码 1111 1111 1111 1111 1111 1111 1111 1111

无符号char 1111 1111 255

255里面有85个3;

254 251 248 245 242 239 .......2..255(-1)....0

所以就得到输出结果3+84+1(2到-1)+85=173

全部评论

相关推荐

03-31 14:46
已编辑
门头沟学院 Web前端
励志成为双港第一ja...:这其实很正常,离的太远了,他认为你不会来,就为了混个面试,而且成本很高,实习生都优先选本地高校。吃了地域的亏,所有很多时候地域可能比院校层次更重要。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务