首页 > 试题广场 >

下列函数中,i的值是?

[单选题]
#include <stdio.h>
int main(){
    unsigned char i = 1;
    i -= 4;
    printf("the value of i is: %d" , i);
}
请问i的值是:
  • 253
  • 254
  • 255
  • 256
推荐
正确答案A

unsigned char 总共8位,1-4 = -3.  -3用8位二进制表示为 1111 1101,因为是无符号数,所以最高位的1不做符号位,作为数值为,11111101对应的十进制数为253
编辑于 2015-02-05 10:36:06 回复(2)
私以为,在计算i-=4的时候就已经发生了类型转换,由unsigned int转换成了int类型。
因而在计算完i-=4这一步以后i的值就已经是253了,而不是-3.
可以一步一步调试看看==

-------------------------------------------------------------------
补充说明
-------------------------------------------------------------------

通过查阅资料,得知,计算机在计算减法时是将负数转换成对应的补码进行运算,通过这种方法,可以将减法运算转换成加法运算。 (http://blog.csdn.net/lida2003/article/details/6973469  
另外, 在表达式计算时,各种整形首先要提升为int类型,然后执行表达式的运算。
(https://zh.wikipedia.org/wiki/%E6%95%B4%E5%9E%8B%E6%8F%90%E5%8D%87 )
于是,在计算 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





编辑于 2016-06-13 16:11:35 回复(8)
负数是用补码表示的
源码:0000 0011
反码:1111 1100
补码:反码+1=1111 1101
因为是无符号数:所以为253
发表于 2015-10-01 14:59:29 回复(5)
unsigned char 是8位,最大表示数字为256,任何数字大于256会对它做mod(256)的操作。
题中i -= 4;得到i=-3,从mod 的角度看-3就是256-3=253 。
发表于 2015-08-17 20:34:38 回复(1)
计算 i-=4 得到 i=-3;
在计算机中 -3以二进制的补码形式保存,-3的二进制为1000 0011;
反码为:1111 1100
补码为:1111 1101(ps:补码=反码+1)
因为unsigned,所以是无符号数,是253
发表于 2020-07-27 10:44:44 回复(0)
天真的德鲁伊他说的对  但是他说的不清楚
他并没有把关键的整型提升这一部分讲解清楚
我字有点丑 但确实是这样分析的
有时候虽然结果答案一样  但你并没有理解这个题

编辑于 2021-11-06 11:02:57 回复(1)
-3的原码是00000011 反码是11111100 补码是11111101
发表于 2018-04-01 11:03:11 回复(0)
负数以补码情况存储:负数对应正数的二进制取反再+1,
如-3:
  1. 正数3的二进制0000 0011
  2. 正数取反 1111 1100
  3. +1  1111 1101
无符号不存在负数,因此其对应补码转换为正数为0111 1101 ->28-3 = 253
编辑于 2019-07-21 16:02:38 回复(0)
补充一下有关unsigned和有符号的知识。

发表于 2017-09-13 08:59:41 回复(0)
在计算的过程中是没有减法运算的,是将减法作为加个负数来算的,负数就是补码,正数的补码是本身,负数的补码是对应正数的反码加1,最后计算出的结果即所求。
发表于 2017-07-20 09:46:52 回复(0)
想一下,是无符号数,所以在是从0到255,是一个无限循环的方式,所以0再减一就到了255。
发表于 2017-06-30 00:33:29 回复(0)
对于无符号来说,最小值再减的话就是最大值
发表于 2022-10-25 21:03:33 回复(0)
通过查阅资料,得知,计算机在计算减法时是将负数转换成对应的补码进行运算,通过这种方法,可以将减法运算转换成加法运算。 http://blog.csdn.net/lida2003/article/details/6973469   
另外, 在表达式计算时,各种整形首先要提升为int类型,然后执行表达式的运算。
于是,在计算 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

发表于 2022-05-01 14:44:07 回复(0)
0对应0,-1对应255,-2对应254,-3对应253
发表于 2019-11-26 23:01:43 回复(0)

正整数最大值-负数+1

发表于 2019-07-04 01:18:50 回复(0)
把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模(最大值)
发表于 2018-07-01 10:23:12 回复(0)
无符号数1,减去1就等于0,再减去1就溢出了(0XFF,也就是255),再减去两次1就是253...   我是这种样算的,笨方法= =  还是别人回答比较深入
发表于 2018-06-23 12:36:34 回复(0)
无符号表示中,1的前一位为0,0的前一位为255,则1向前数4位分别为253 254 255 0 1,则选253
发表于 2017-11-09 11:25:15 回复(0)
注意题目问的是i的值(253),而不是输出值(-3)
发表于 2017-10-24 13:36:40 回复(0)
unsigned char 类型为8位,1-4 = -3,-3二进制表示 1111 11101,因为无符号所以对应十进制523
发表于 2016-10-31 22:00:35 回复(0)
-3用二进制表示出来后,高位不当作符号位时就是对应的整形数。
发表于 2016-05-24 18:34:54 回复(0)