c语言: 为什么会输出65535?
答案:3 悬赏:50 手机版
解决时间 2021-03-05 15:18
- 提问者网友:轻浮
- 2021-03-04 19:51
c语言: 为什么会输出65535?
最佳答案
- 五星知识达人网友:轮獄道
- 2021-03-04 21:20
因为你把a定义成了unsigned short 类型,-1的补码是1111111111111111,把-1赋值给a,而a又因为是unsigned short 类型,从而不能存放负数,所以此时最高位的一不在表示负号,而是代表数值,所以就变成了65535,如果你把a定义为int类型,就会输出-1,注意,在赋值过程中应该避免将一个负数赋给unsigned 的类型。追问那65535是怎么来的?追答详解如下:
首先,不论short类型,还是unsigned short类型的变量,其存储的数值都是以补码的形式存储的,如果数值占两个字节,就有16位二进制位。
其次,应该了解二进制数码的知识,这里详细解释一下,二进制数码分为原码,反码,补码,
例如十进制数1如果用两个字节存储的话,其二进制原码为0000000000000001,注意最高位是0表示正数,最高位是1表示负数,所以-1的二进制原码为1000000000000001。正数的反码,补码与其原码是相同的,所以1的反码和补码都是0000000000000001。但是负数的反码应该是这样的,保持其最高位不变(因为最高位是符号位),其他位按位取反,因此-1的反码是11111111111111110,而负数的补码是在其反码的基础上加1,因此-1的补码是11111111111111111.
最后,我们知道short类型可以存储带符号的数,就是说可以存储正负数,而unsigned short类型只能存放正数,当把-1赋给一个unsigned short类型的变量时,也就是把其补码1111111111111111赋给了该变量,由于对于unsigned short类型来说,数值的最高位不再用来表示符号,而是用来表示数值,故把1111111111111111当作一个纯粹的无符号二进制数,你可以将1111111111111111转换一下,它就是十进制数65535。如果你把-1赋给了short类型就会正常输出-1.
特别申明一下,在以后编程的时候,切记不要把一个负数赋给unsigned类型的变量。因为unsigned类型的变量只能用来存放正数。现在思路清晰了吗?
首先,不论short类型,还是unsigned short类型的变量,其存储的数值都是以补码的形式存储的,如果数值占两个字节,就有16位二进制位。
其次,应该了解二进制数码的知识,这里详细解释一下,二进制数码分为原码,反码,补码,
例如十进制数1如果用两个字节存储的话,其二进制原码为0000000000000001,注意最高位是0表示正数,最高位是1表示负数,所以-1的二进制原码为1000000000000001。正数的反码,补码与其原码是相同的,所以1的反码和补码都是0000000000000001。但是负数的反码应该是这样的,保持其最高位不变(因为最高位是符号位),其他位按位取反,因此-1的反码是11111111111111110,而负数的补码是在其反码的基础上加1,因此-1的补码是11111111111111111.
最后,我们知道short类型可以存储带符号的数,就是说可以存储正负数,而unsigned short类型只能存放正数,当把-1赋给一个unsigned short类型的变量时,也就是把其补码1111111111111111赋给了该变量,由于对于unsigned short类型来说,数值的最高位不再用来表示符号,而是用来表示数值,故把1111111111111111当作一个纯粹的无符号二进制数,你可以将1111111111111111转换一下,它就是十进制数65535。如果你把-1赋给了short类型就会正常输出-1.
特别申明一下,在以后编程的时候,切记不要把一个负数赋给unsigned类型的变量。因为unsigned类型的变量只能用来存放正数。现在思路清晰了吗?
全部回答
- 1楼网友:底特律间谍
- 2021-03-04 23:17
由楼主疑惑可知:楼主使用的是16位的编译器,short int和int的位数一样
1. 显示输出为%u(无符号整形);声明变量a时是unsigned short 无符号短整型,数值范围是0~65535
2. 变量b为整形,短整型一样,长度也是16位,数值范围是-32768~32767
3. b=-1,在内存中将以补码的形式存储,最高位为符号位(=1,代表负数),其余15位(000 0000 0000 0001)取反后(有源码吗,看看
1. 显示输出为%u(无符号整形);声明变量a时是unsigned short 无符号短整型,数值范围是0~65535
2. 变量b为整形,短整型一样,长度也是16位,数值范围是-32768~32767
3. b=-1,在内存中将以补码的形式存储,最高位为符号位(=1,代表负数),其余15位(000 0000 0000 0001)取反后(有源码吗,看看
- 2楼网友:長槍戰八方
- 2021-03-04 22:00
有符号数 与 无符号数 , %u表示以无符号显示。
有符号数采用补码,
短整数 -1 就是 用 65535 表示 -1的,这就是补码。
所以, 短整数 -1 跟 无符号数 65535 内部是完全一样的。
你要了解“补码”的概念就明白了。
有符号数采用补码,
短整数 -1 就是 用 65535 表示 -1的,这就是补码。
所以, 短整数 -1 跟 无符号数 65535 内部是完全一样的。
你要了解“补码”的概念就明白了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯