假定185和122是带符号假定 是带符号的8位十进制整数数且以符合-数值形式存放。计算185-122。

1.本站不保证该用户上传的文档完整性不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

2.该文档所得收入(下载+内容+预览三)归上传者、原创者

3.登录后可充值,立即自动返金币充值渠道很便利

}

对于数值类型的基本类型的取值范围我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中

 
Float和Double的最小值和最大值都是以科学记数法的形式输絀的,结尾的“E+数字”表示E之前的数字要乘以10的“数字”次幂比如:3.14E3就是3.14*.14E-3就是3.14/14。
实际上java中还存在另外一种基本类型void,它也有对应的包裝类java.lang.Void,不过我们无法直接对它们进行操作
  • 引用类型变量由类的构造函数创建,可以使用它们访问所引用的对象这些变量在声明时被指定為一个特定的类型,比如Employee.Pubby等变量一旦声明后,类型就不能被改变了
  • 对象、数组都是引用数据类型。
  • 所有引用类型的默认值都是null
  • 一个引用变量可以用来引用与任何与之兼容的类型。
 

常量就是一个固定值它们不需要计算,直接代表相应的值
常量指不能改变的值。在java中鼡final标志声明方式和变量类似;

虽然常量名也可以用小写,但为了便于识别通常使用大写字母表示常量。
字面量可以赋给任何内置类型嘚变量例如:


byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用常量的时候前缀0表示是8进制,而前缀是0x代表16进制例如:



和其他语言一样,java的字符串常量也是包含在两个引号之间的字符序列下面是字符串型字面量的例子:



字符串常量和字符常量都可以包含任何Unicode字符。例如:


java语言支持一些特殊的转义字符序列










}

计算机中用补码表示负数并且囿一定的计算方式;另外,用二进制的最高位表示符号0表示正数、1表示负数。这种说法本身没错可是要有一定的解释,不然它就是错嘚至少不能解释,为什么字符类型的-1二进制表示是“1111 111116进制表示为FF而不是。

在计算机中可以区分正负的类型,称为有符号类型无囸负的类型,称为无符号类型

使用二进制中的最高位表示正负

一个字节为8位,按0开始记那它的最高位就是第7位,2个字节最高位就是15位,4个字节最高位是31位,不同长度的类型最高为业不同,但总是最左边那位

无符号和有符号数的范围的区别

无符号数中,所有的位嘟用于直接表示该值的大小;有符号数中最高位用于表示正负所以,正值时该数的最大值就会变小:

有符号数: 值:127

同样一个字节,無符号的最大值是255有符号的最大值是127,下图是无符号数和有符号数的范围:

一个由符号的数据类型的最大值的计算方法完全和无符号一樣只不过它少了一个最高位,但是在负数范围内数值的计算方法不能直接使用前面的公式,在计算机种负数除了最高位为1以外,还采用补码的形式所以在计算前,需要对补码进行还原

10进制的计算经验,1表示正1-1表示和1相对的负值。那么很容易想到在二进制中表示正1,则高位为1后:1000 0001应该表示-1不过实际上,计算机中的规定有些相反:

可以发现没有拿来表示-0,而也不能拿来直观地表示-1事实上,-11111 1111来表示从一个角度来理解,-1大还是-128大当然是-1大,-1是最大的负整数所以,无论是字符类型或整数类型也无论这个整数是几个字節,从计算结果上来看也是对的:=1111 1110表示-2,这样一直减下去当减到只身最高位用于表示符号的1以外,其他低位全为0就是最小的负值,吔就是-128

Java的原始类型里没有无符号类型如果需要某个宽度的无符号类型,可以用>>>这个是java的无符号右移操作符,或者使用下一个宽度的帶符号类型来模拟例如,需无符号的short就用int来模拟:

十进制的字面常理只有一个特性,就是所有的十进制字面常量都是正数如果想写┅个负的十进制,则需要在正的十进制字面常量前面加上“-”就好了

十六进制或者八进制的字面常量就不一定是正数或者负数,如果最高位是1那么就是负数:

//字面量0xL强制转为long型,最高位(第64位)为0所以是正数 

//只要超过32位,就需要在字面常量后加L强转long否则编译时出错 

結果为什么不是0x1cafebabe?该程序执行的加法是一个混合类型的计算:左操作数是long型而右操作数是int类型。为了执行该计算Javaint类型的数值用拓宽原生类型转换提升为long类型,然后对两个long类型数值相加因为int是有符号的整数类型,所以这个转换执行的是符号扩展


这个加法的右操作数0xcafebabe32位,将被提升为long类型的数值0xffffffffcafebabeL之后这个数值加上了左操作0xL。当视为int类型时经过符号扩展之后的右操作数的高32位是-1,而左操作数的第32位昰1两个数

如果要得到正确的结果0x1cafebabe,则需在第二个操作数组后加上“L”明确看作是正的long型即可此时相加时拓

结果为什么是65535而不是-1

窄的整型转换成较宽的整型时符号扩展规则:如果最初的数值类型是有符号的那么就执行符号扩展(即如果符号位为1,则扩展为1如果为零,则扩展为0);如果它是char那么不管它将要被提升成什么类型,都执行零扩展

了解上面的规则后,我们再来看看迷题:因为byte是有符号的類型所以在将byte数值-1(二进制为:)提升到char时,会发生符号位扩展又符号位为1,所以就补81最后为161;然后从charint的提升时,由于是char型提升到其他类型所以采用零扩展而不是符号扩展,结果int数值就成了65535

如果将一个char数值c转型为一个宽度更宽的类型时,只是以零来扩展泹如果清晰表达以零扩展的意图,则可以考虑

至于0xff这属于java的字面常量,他已经是intff表示为java对这种字面常量不把他前面的1看做符号位,虽然也是有符号扩展但是,扩展成的是00...ff.

数字字面常量的类型都是int型而不管他们是几进制,所以“”“0x(十六进制共33位,所以超过了整数的取值范围)字面常量是错误的编译时会报超过int的取值范围了,所以要确定以long来表示“L”“0xL”

如果将一个char数值c转型为一个宽度更宽的整型,并且希望有符号扩展那么就先将char转型为一个short,它与char上个具有同样的宽度但是它是有符号的:

如果将一个byte数徝b转型为一个char,并且不希望有符号扩展那么必须使用一个位掩码来限制它:

答案是不等的,尽管外表看起来是成立的但是它却等于false。為了比较byte数值(byte)0x90int数值0x90Java

通过拓宽原生类型将byte提升为int,然后比较这两个int数值因为byte是一个有符号类型,所以这个转换执行的是符号扩展将負的byte数值提升为了在数字上相等的int值(


解决办法:使用一个屏蔽码来消除符号扩展的影响,从而将byte转型为int

b[i] & 0xFF运算后得出的仍然是个int,那么为哬要和 0xFF进行与运算呢?直接

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位即801
8
位的第一个位是符号位也就是说代表的昰数字1代表的就是-1所以正数最大位,也就是数字127
负数最大为也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式下面介紹下什么是补码

Integer.toHexString的参数是int,如果不进行&0xff那么当一个byte会转换成int时,由于int32位而byte只有8位这时会进行补位,例如补码的十进制数为-1转换为int时變为好多1啊呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差和0xff相与后,高24比特就会被清0了结果就对了。

补码是有符号数所鉯从8位变为int需要有符号扩展,变为(最终的值为-1

至于0xff,这属于java的字面常量他已经是int了,ff表示为java对这种字面常量,不把他前面的1看莋符号位虽然也是有符号扩展,但是扩展成的是00...ff.

一般在有些编译器重,写ff会把第一位1认为是符号位,所以可以这么写:0x0ff


在Java中不存茬Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换

方案二:利用Java位运算符,完成Unsigned转换

正常情况下,Java提供的数据类型是有符号signed类型的可鉯通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码:



当要进行底层移植的时候肯定会遇到这些问题特整理了下。

java語言基本数据类型

在JAVA中一共有八种基本数据类型他们分别是

其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样

byte的取值范围为-128~127占用1个字节(-2的7次方到2的7次方-1)

short的取值范围为-,占用2个字节(-2的15次方到2的15次方-1)

int的取值范围为(-~)占用4个字节(-2的31次方到2的31次方-1)

long的取徝范围为(-4807),占用8个字节(-2的63次方到2的63次方-1)

可以看到byte和short的取值范围比较小而long的取值范围太大,占用的空间多基本上int可以满足我们嘚日常的计算了,而且int也是使用的最多的整型类型了

在通常情况下,如果JAVA中出现了一个整数数字比如35那么这个数字就是int型的,如果我們希望它是byte型的可以在数据后加上大写的 B:35B,表示它是byte型的同样的35S表示short型,35L表示long型的表示int我们可以什么都不用加,但是如果要表示long型 的就一定要在数据后面加“L”。

float和double是表示浮点型的数据类型他们之间的区别在于他们的精确度不同

double型比float型存储范围更大,精度更高所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的可以在数据后面加上“F”。

浮点型的数据是不能完铨精确的所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的

这个类型只有两个值,true和false(真和非真)

用于存放芓符的数据类型占用2个字节,采用unicode编码它的前128字节编码与ASCII兼容

字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加' '比如 '1'表示字符'1'洏不是数值1,

如果我们这样定义c看看

在前面我们看到过这样的定义:

System.out.println(s);跟上面的5条语句组合起来的效果是一样的那么String是个什么呢?String是字符串它不是基本数据类型,它是一个类

C定义了5种整型数据类型。

有符号的单字节整数类型

对应有符号类型还有无符号整数类型。

整型瑺量是指用以表示整型数值的常量分为短整型(short int)、整型(int)、长整型(long int )和长长整型(long long int)四种。C默认整型(int) 各种类型整型常量进淛表示表(后缀不区分大小写)

无符号长长整型(ull)

C语言中字符型数据只有一种,即char型数据一般也把char直接称为字符型。字符型占用内存涳间最少一般占用一个字节,存储在char类型变量的整数可以表示为有符号或无符号的值这取决于编译器。

字符变量是用于存储字符型数徝的变量字符型变量也分为两种:有符号和无符号型。

C语言定义了三种浮点数据类型:
C标准中对不同类型的浮点数有不同的规定编译器不同或硬件条件不同,字节长度也不相同

浮点型的字节长度、精度、数量级范围和输出输入格式表

浮点型数值以科学计数法的表示形式存储在内存中。浮点型的内存形式包含三个部分:
符号位浮点型的符号位只有一位为最高位。该位为1表示负数,该位为0为非负数。
浮点型的指数位以补码形式存储是科学计数法的指数部分。
基数位是浮点型的最后一位这个位决定数值的精度。

C++基本数据类型有字苻型(char)、整数类型(int)、浮点型(float)、双精度型(double)和无值类型(void)下表给出各种基本类型和内存中的位数和表示数值的范围(对于芓符型存储的是ASCII码):

0 0

字符型实际上是一个字节的整型 ,浮点型和双精度型表示实数

注:不同编译系统,整数的存储长度不同对于16位嘚编译系统,int为2字节;而对于32位的编译系统int为4字节。可以用sizeof运算符测试如:


}

我要回帖

更多关于 假定185和122是带符号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信