1,(在有符号的情况下)若一个二进制数都是1,则对应的十进制数是-1

2,在定义数值类型时,若无特别说明,整数默认:int  小数默认:double
在内存中
      占字节数            取值范围
(1)byte:1个字节(8个二进制位) -2(7) ---     2(7)-1
(2)short:2个字节(16个二进制位)-2(15)---   2(15)-1
(3)int :4个字节(32个二进制位)-2(31)---     2(31)-1
(4)long: 8个字节(64个二进制位)-2(63) ---  2(63)-1
class VarDemo
{
public static void main(String[] args)
{
//数据类型 变量名 = 初始化值
byte b = 6;
short c = 8;
int x = 123;
long l = 123456789006l; //注意最后是英文字母“l”,不是数字1
}
}

虽然在程序中定义了byte类型的变量b,并赋给了初值为整数6,但是此时这个整数6是默认为int(占据4个字节)类型的,在内存中的表示形式为:00000000 00000000 00000000 00000110,但是byte在内存中只占据了一个字节00000000,那他是如何装下这个整数6呢?

但是编译器在检查的时候,发现6这个整数在byte范围之内,所以会自动把前面的三个字节段去掉
【00000000 00000000 00000000 00000110】---》【00000110】

其他的依照这个类推!

class VarDemo
{
public static void main(String[] args)
{
byte b = 6; short s = 4; int i = 7; long l = 1234567890l; //过大的数(范围超过了int型) float f = 2.3f; //如果不加f的话,编译的时候会报错,说损失精度,因为小数默认是double类型的 double d = 3.4; char c = '1'; //char c = 1 boolean bo = true; //bo = false
}
}
//自动类型转换
class VarDemo2
{
public static void main(String[] args)
{
/*
byte b = 4;
int x = 3;
x = x + b; //b就自动类型提升为和x一样的整形。
System.out.println("x="+x);
*/ byte b = 3;
b = b + 1;
/*
      【在编译的时候,b=b+1是不会做加法运算的,所以下文中说到的相加是不准确的。】
这一句在编译的时候会报错,因为在做相加之前
byte类型的变量b被自动提升为了和1一样的整形类型
,所以相加完后的结果为整形,但是要赋给的变量b此时
是byte类型的,所以可能丢失精度,此时编译器会报错:
原理如下图(1) 但是此时又有这样一个疑问:
在定义byte b = 3;的时候,3也是整形的,
那为什么整形的3可以赋值给byte类型的变量b呢(这个解释就是上面所说的内容)
疑问是虽然做完了加法运算后的结果为整数(4),但是整形的4也在byte范围之内啊,
此时为什么就不能赋给byte类型的变量b了呢? 原因是:
因为在做加法之前,byte类型的变量b的值是不确定的,比如如下代码
byte b = 3;
b = 127;
b = b+1;
这个时候做完加法后的结果是整形的数值128,而此时128已然超出了byte类型的范围,所以如果再
把128赋给byte类型的变量b,就会发生数据损失。 而byte b = 3之所以可以完成把整形(int)的数3赋给byte类型的变量b是因为编译器在检查的时候
判断了这个3是在byte范围之内的,并且这个3是一个常量,值不会改变,(就是数值3)所以可以按照上面的
方法把这个整形的3赋给byte类型的变量b。 总结一句话就是:
若是不变的量(常量)在判断后,符合这个类型的取值范围,则可以成功赋值。
若是变量,则不能再赋值。比如 上面的b = b + 1;(第二个b是变量,不确定其值,万一b等于127呢?思考...)
*/
System.out.println("b="+b);
}
}

        /*可以通过强制类型转换,实现上述赋值*/
//byte b = 3;
//b = (byte)(b+1);
System.out.println("b="+b);      //但是种转换可能发生数据丢失:如下图:

class OperateDemo
{
public static void main(String[] args)
{
/*【算术运算符】 + - * / %(取余数)
*/
int x1 = 3810;
System.out.println(x/1000); System.out.println(2%5); //结果为2
System.out.println(-2%5); //结果为-2
System.out.println(2%-5); //结果为2
System.out.println(-2%-5); //结果为-2
//总结:结果为正还是为负,取决于左边的操作数。
// 若左边操作数为正,则结果一定为正,
// 若左边的操作数为负,则结果一定为负。
//应用:
// 如果想让某一个结果控制在这个数的范围内,
// 则可以用模运算进行操作。比如想让某一个数
// 的结果控制在10以内,就模10,则运算后的结果
// 一定在10以内 /*
【++:自增】。对原有的数据进行+1 int a = 3;
a++ ++a--->a = a+1;
//当自增,自减进行独立运算的时候,++a和a++是没有区别的。
a++;
System.out.println("a="+a) //结果是a=4 ++a;
System.out.println("a="+a) //结果是a=4 */ //当这个自增运算和其他运算放在一起时,就有区别了: int a= 3,b;
b = ++a;
System.out.println("a="+a+"b="+b); //结果是a=4,b=4 /*
b = ++a;
运算过程如下:
a先执行a = a+1;再把此时a的值赋给b
*/ b=a++;
System.out.println("a="+a+"b="+b); //运算结果是a=4,b=3; /*
b = a++;
运算过程如下:
先在内存中开辟一块空间,把a的值3临时存储下来,然后做a= a+1运算,
此时a的值为4。再把原有的a的值赋给b,则此时b的值为3。 其运算原理如下:
temp = a; //先将a进行临时存储。
a = a+1; //自增
b = temp; //将临时的值赋给b。
*/ //字符串的连接符:
System.out.println(5+5); //输出结果为整数10
System.out.println("5"+5); //输出结果为字符串55
System.out.println("5+5="+5+5); //输出结果为5+5=55
System.out.println("5+5="+(5+5)); //输出结果为5+5=10 //【赋值运算符】:= , +=, -= , *= , /= , %=
int x,y,z;
x=y=z; int a = 3; //把右边赋给左边
a+=4; //将左右两边的和赋给左边a = a+4; //练习题:下面两个式子有区别吗?
short s = 4;
//s = s+5; //编译不能通过 //s+=5; //编译可以通过,因为+=是赋值运算符,会做自动转换。 //【比较运算符】
System.out.println(3==4); //输出结果为:false
//运算完的结果要么true,要么false //【逻辑运算符】用来连接boolean型表达式的。
/*
&:与
|:或
^:异或
!:非 && :短路与 || :短路或
*/
int x = 7;
//x>2 & x<5
//x<2 | x>5 /*
&:两边都为true,结果为true.否则为false.
|:两边都为false,结果为false,否则为true.
^:两边相同为false,两边相异为true.
*/ //&& :短路与 || :短路或
y>3 & y<6
y>3 && y<6 /*
& 和 && 的区别:
&:无论左边结果是什么,两边都参与运算。
&&:当左边为false,右边不参与运算。 | 和 ||的区别:
|: 两边都参与运算。
||:当左边为true时,右边不参与运算。
*/ }
}

《JAVA----day01和day02》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 浅谈java中死锁问题

    知识点:死锁的产生.死锁的实例 一:死锁的产生 我们在解决多线程共享资源的线程同步问题时,会使用synchronized关键字修饰方法或者通过Lock加锁方式修饰方法.代码块,防止多个线程访问统一资源 ...

  2. C++小结:迟到的小结和重新起航的故事

    迟到的小结和重新起航的故事 有关这个学期的故事,随着这个学期的结束也划上了一个句号. 正如之前博客里面(还是空间里面)提到的,在这个过程中的收获比最后考试的结果更重要. 就像这次的计算器,也许会对最后 ...

  3. Nmap从探测到漏洞利用备忘录 – Nmap简介(一)

    在侦查期间,扫描一直是信息收集的初始阶段. 什么是侦查 侦查是尽可能多收集关于目标网络的信息.从黑客的角度来看,信息收集对于一次攻击非常有用,所以为了封锁恶意的企图,渗透测试者通常尽力查找这些信息,发 ...

  4. python ros 订阅robot_pose获取机器人位置

    #!/usr/bin/env python import rospy import tf from tf.transformations import * from std_msgs.msg impo ...

  5. Windows 2003 server下载

    http://www.downza.cn/soft/182837.html或http://www.imsdn.cn/operating-systems/windows-server-2003/

  6. java中的值传递和引用传递用法详解

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对 ...

  7. Cocoapods 报警告Automatically assigning platform ios with version 9.0 on target....

    Automatically assigning platform iOS with version 9.0 on target 你的工程名称 because no platform was speci ...

  8. AMD,CMD.CommonJs和UMD还有es6的模块化对比

    CommonJS CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行, ...

  9. 机器学习 Matplotlib库入门

    2017-07-21 15:22:05 Matplotlib库是一个优秀的python的数据可视化的第三方类库,其中的pyplot支持了类似matlab的图像输出操作.matplotlib.pyplo ...

  10. Redis的介绍

    REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守B ...