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

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

全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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