牛客上刷题的时候,碰上了一道如下所示的题目:1
2
3
4
5
6int main()
{
unsigned char i = 1;
i -= 4;
printf(“the value of i is: % d”, i);
}
请问i的值是:
A.253
B.254
C.255
D.256
正确答案是:A:253
刚开始做这个题的时候没多大注意,普通的类型转换无符号数的加减。
然而,我选择的254是错误的。
在看题目下边网友的回答中,大多数的回答是说计算i-4之后结果为-3,最后printf输出%d输出的时候转换成10进制输出。
我在边看回答的过程中,顺便将代码贴到编译器中一步一步调试了看了一下,结果发现,在执行完i-=4之后,i就已经是253了,而不是回答所说的-3.
通过查阅资料,这里涉及两点内容
因此,在计算i-=4的时候就已经发生了类型转换,由unsigned int转换成了int类型。
因而在计算完i-=4这一步以后i的值就已经是253了,而不是-3.
在计算 i-=4这一步时,会发生如下转换:
实际计算的是 i+(-4)的计算。
i=1 :0000 0001
-4作为负数,在计算机中是以补码的形式参与运算。
[ -4 ]原=1000 0100
[ -4 ] 反 =1111 1011
[ -4 ] 补 =1111 1100
在计算时,以下两个值进行相加:
i=1: 0000 0001
-4: 1111 1100
相加之和是:1111 1101
即:253