在C++中 short a=2;e=~a;为什么e的输出结果是-3,哪位高手帮我解释一下?

作者&投稿:才旦趴 (若有异议请与网页底部的电邮联系)
问题: short a=3; short b=4; short c=a+b;//报错 short d=3+4;//没错 这是为什么?~

我来为你解答这个问题,java中只有int的值超出范围时,才会从头开始计数,就比如 int i=2147483647时,是int的最大值。
;i=i+1;这时int就会超出范围,它就会从-2147483648开始,从最小的又开。但是其他类型不是这样的,就像short类型它默认不是这样的,它如果超出范围就会报错。你这里的short c=a+b,因为a是变量,b是变量,它不能确定变量是不是超出short的范围,就报错了, short d=3+4是两个具体的数值相加,它能判断出3和4都在short的范围内,自然不会报错。。

属于字节对齐问题。请参考如下文档。

因为任何数字在计算机里面都是以补码的形式存储的
正数的补码和原码相同
负数的补码 = 反码 + 1,而反码 = 原码除符号位外各位取反的
对于short形的变量,2的原码为:0000 0000 0000 0010
取反后:1111 1111 1111 1101
可以看出,2取反后,最高位是1的,所以已经是负数了,当我们输出和存储时是以补码的形式的,所以要转换下
~a的原码 = 1111 1111 1111 1101
~a的反码=1 000 0000 0000 0010
~a的补码 = 1000 0000 0000 0011 也就是-3哈
所以得出-3了

~按位取反运算符:
按位取反运算是单目运算,用来求一个位串信息按位的反,即哪些为0的位,结果是1,而哪些为1的位,结果是0。

a = 2; 2的二进制是 10,那么 ~a就是 11111101 【在这里short是8位】
8位的11111101 就是-3.
你打开计算器,选择字节,输入-3,再转化成为二进制,就是11111101。

具体的负数在计算机中怎么表示,请参考相关资料,比较多,这里讲不清楚
-----------------------------------------------------------------------

在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码 0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”的概念:
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。
例如: 时钟的计量范围是0~11,模=12。
表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。
例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
一种是倒拨4小时,即:10-4=6
另一种是顺拨8小时:10+8=12+6=6
在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。
对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2(8)。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。

~是取反的意思
short占2字节
则 a 的二进制表示为: 0000 0000 0000 0010 (其中最高位0为符号位,表示正)
~a 的二进制表示为: 1111 1111 1111 1101 (其中最高位1为符号位,表示负)

计算机中负数都是用补码的方式储存,所以
~a 去补运算后(取反加一) :1000 0000 0000 0011 = -3

希望你能理解

~ 按位取反运算符
简单点
~x=-(x+1)

具体点
注意这里是 short型
2的二进制00000000 00000010
取反的话 11111111 11111101
这就变成负数了 只要要取反的数不超过 2个字节(short)正数取反会得到负数
负数是用补码存储的(其实正数也是,只不过正数的补码没有变化)

-3的补码 是取绝对值 再取反 再加+1
00000000 0000011
11111111 1111100
11111111 1111101
是不是 和~2 结果一样

~表示按位取反。
short a=2 二进制表示:00000000 00000010
取反后的二进制表示: 11111111 11111101
这个值表示的就是-3


九龙坡区15938107749: 在C++中 short a=2;e=~a;为什么e的输出结果是 - 3,哪位高手帮我解释一下? -
林蚂海之: 因为任何数字在计算机里面都是以补码的形式存储的 正数的补码和原码相同 负数的补码 = 反码 + 1,而反码 = 原码除符号位外各位取反的 对于short形的变量,2的原码为:0000 0000 0000 0010 取反后:1111 1111 1111 1101 可以看出,2取反后,最高位是1的,所以已经是负数了,当我们输出和存储时是以补码的形式的,所以要转换下 ~a的原码 = 1111 1111 1111 1101 ~a的反码=1 000 0000 0000 0010 ~a的补码 = 1000 0000 0000 0011 也就是-3哈 所以得出-3了

九龙坡区15938107749: C++中short相对有什么好处 -
林蚂海之: short节省空间.short占内存是Int的一半,想要节省空间而且不会溢出时用short.unsigned是无符号数.取值范围是0~INT_MAX*2(如果是unsigned long就是0~ULONG_MAX*2),可以在不多占内存的情况下,增大一倍的应用范围.

九龙坡区15938107749: c++ 补码 -
林蚂海之: short在内存中为两个字节,其值的范围是从-32768----327671000000000000000取反0111111111111111加1还是1000000000000000 最高位为是负数,其值是32768,就是—32768.

九龙坡区15938107749: 关于c#中,a+=2的原理 -
林蚂海之: 因为c#的语法也继承自c语言家族,而c语言是作为一种较为接近底层的语言产生的,在汇编语言中,有三操作数的ADD指令: ADD a, b, c 这就是 a=b+c 也有二操作数的ADD指令:ADD a, b 这就是 a+=b 还有一操作数的自增指令: INC a 这就是 a++ 所以相应的风格也随着c语言带到了c#之中 至于意义方面,将一个变量a的值增加b, a+=b这种写法显然比a=a+b更贴切更自然 而效率方面,a+=b和a=a+b在c#中是没有区别的

九龙坡区15938107749: c语言中short用%什么? -
林蚂海之: %hd 例如: #include <stdio.h> int main(int argc, char *argv[]) {unsigned short ushort = 0;short nshort = 0; scanf("%hd%hd", &ushort, &nshort); printf("ushort=%u\n", ushort); //以下两句等效printf("nshort=%hd\n", nshort);printf("nshort=%hd\n", nshort); return 0; }

九龙坡区15938107749: 在c语言中,设a为short型变量,描述“a是奇数”的表达式是 -
林蚂海之: 描述“a是奇数”的表达式是: a%2==1

九龙坡区15938107749: 选择.设C语言中,int类型数据占2个字节,则short类型数据占几个字节 -
林蚂海之: short是占两个2113字节. short在C语言中是定义一种整型变量家族的一种,shorti;表示定义一个短整型的变量i. 依据程序编译器的不同short定义的5261字节数不同,标准定义short短整型变量不得低于16位,即两个字节,4102编译器头文件夹...

九龙坡区15938107749: C语言int - abc - =2和short do=15哪个是合法语句,为什么 -
林蚂海之: do是c++中的保留字,do是循环结构.

九龙坡区15938107749: c++中赋值时类型的转换是怎么换的 -
林蚂海之: 数值在计算机内是以补码的形式保存的.short int占2字节(16位),-1的补码是1111,1111,1111,1111.unsigned long和long都是4字节(32位),当把长度小的类型赋给长度大的类型时,会把原来的值放到低位,然后在高位用原来的值的最高...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网