操作数

Java虚拟机--内存结构

筅森魡賤 提交于 2020-03-13 05:35:53
1.JVM是什么?    JVM:Java Virtual Mechinal(Java虚拟机).它是一个虚构的计算机,是通过在实际的计算机上模拟各种功能来实现的。JVM的主要工作是解释自己的指令集(字节码,如java源码编译成class文件在虚拟机上运行)并映射到本地的CPU指令集或OS的系统调用。Java语言跨平台的本质就是不同的操作系统使用不同的JVM映射规则,使其与操作系统无关,从而实现跨平台。 2.JVM的内存结构是什么样子?    Java虚拟机在运行Java程序的时候,会把它所管理的内存划分为若干个不同的数据区域,如图:        3.那么接下来每个数据区域都是做什么的呢?    (1).程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。尤其在多线程的情况下,尤为重要。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,即在任何一个确定时刻,一个处理器只会执行一条线程,当线程切换后就需要恢复到正确位置,因此,程序计数器要实现线程隔离,每个线程都有自己的专属的计数器。值得注意的是: 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。    (2).堆 : 此内存区域是Java虚拟机管理的最大一块内存,同时也是线程共有的,在虚拟机启动时创建

扒一扒那些教程中不常被提及的JavaScript小技巧

独自空忆成欢 提交于 2020-03-11 09:49:27
1、过滤唯一值 Set 类型是在 ES6 中新增的,它类似于数组,但是成员的值都是唯一的,没有重复的值。结合扩展运算符(...)我们可以创建一个新的数组,达到过滤原数组重复值的功能。 const array = [1, 2, 3, 3, 5, 5, 1]; const uniqueArray = [...new Set(array)]; console.log(uniqueArray); // [1, 2, 3, 5] 在ES6之前,我们如果想要实现这个功能的话,需要的处理代码要多很多。 这个技巧的适用范围是数组中的数值的类型为: undefined , null , boolean , string , number 。当包涵 object , function , array 时,则不适用。 2、短路求值(Short-Circuit Evaluation) 三目运算符是一个很方便快捷的书写一些简单的逻辑语句的方式, x > 100 ? 'Above 100' : 'Below 100'; x > 100 ? (x > 200 ? 'Above 200' : 'Between 100-200') : 'Below 100'; 但是有些时候当逻辑复杂之后,三目运算符书写起来可读性也会很难。这个时候,我们就可以使用逻辑与(&&)和逻辑或(||)运算符来改写我们的表达式。

javascript(运算符)

房东的猫 提交于 2020-03-10 17:16:21
运算符的概念 运算符用于将一个值进行运算从而得出所需要的结果值。 就像在数学中,也需要加、减、乘、除这些运算符来进行运算。 数据可以是常量,也可以是变量。被运算符操作的数又称为操作数。 运算符的种类 算术运算符 赋值运算符 比较运算符 逻辑运算符 三元运算符 算术运算符 加减乘除 取模求余 名称 含义 加法运算符(+) 对俩个值进行加法运算,并且将结果返回 减法运算符(-) 对俩个值进行减法运算,并且将结果返回 乘法运算符(*) 对俩个值进行乘法运算,并且将结果返回 除法运算符(/) 对俩个值进行除法运算,并且将结果返回 取模运算符(%) 对俩个值进行取模求余运算,并且将结果返回 算术运算符小结 : 将操作符参与数学计算(通常为数学计算,+号也有特殊的用法,如连接字符串) 加法运算符有三层含义: 第一层含义:当俩边的数据类型是 数字(number)类型 时,那么’+‘号代表算术运算符中的相加的意思。 第二层含义:当加号俩边的数据类型有一个 字符串数据类型 时,那么’+‘号代表字符串的 拼接符 。 第三层含义:具有隐式转换的功能 当 字符串 前面有’+'号时,会把字符串自动转换成 Numbe r数据类型 使用’+'号拼接字符串 当加号俩边的数据类型有一个字符串数据类型时,那么 '+' 号代表字符串的拼接符。 var num1 = 100 + 100 console . log (

python学习笔记之带下划线的特殊方法总结

▼魔方 西西 提交于 2020-03-09 08:40:11
Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。 他们是可以给你的类增加特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。 Python 的这些方法非常强大,然而随之而来的则是责任。了解正确的方法去使用非常重要! 方法名 含义 基本的方法 __new__方法 1.__new__是在一个对象实例化的时候所调用的第一个方法 2.它的第一个参数是这个类,其他的参数是用来直接传递给 __init__方法 3.__new__决定是否要使用该 __init__方法,因为 __new__可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__没有返回实例对象,则 __init__不会被调用 4. __new__主要是用于继承一个不可变的类型比如一个 tuple 或者 string __init__方法 构造器,当一个实例被创建的时候调用的初始化方法 __del__方法 析构器,当一个实例被销毁的时候调用的方法 __call__方法 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__方法(a, b) __len__方法 定义当被 len() 调用时的行为 __repr_

条件转移指令详解

故事扮演 提交于 2020-03-09 08:23:16
程序控制指令又称为控制转移指令,包括:转移指令、循环控制指令、过程调用指令和 中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。 1.无条件转移指令 JMP 计算机程序的执行完全按照 CS:IP 的指向执行指令。 通常情况下 CS 保持不变,IP 自动 增量,程序就按照指令的先后顺序执行。无条件转移指令会修改 CS 和 IP 的值,使程序跳 转到另一个位置去执行,改变指令的执行顺序。 根据程序的转移范围可分为段内转移和段间转移。 在同一段的范围之内进行转移,只需 要修改 IP 的值,称为段内转移。如果 CS 的值被修改,意味着程序将转移到另外的段去执行, 这称为段间转移。段间转移不仅修改段基址 CS 的值,还修改IP 的值。 JMP 指令不影响标志位。 1)段内转移 指令格式: JMP OPRD 功能:段内转移,IP IP+位移量,或给 IP 赋值。 说明:根据 OPRD 的类型又分为段内直接转移和段内间接转移。指令不影响标志位。 例如: JMP LABEL ,程序转移到 LABEL 指明的指令处继续执行。例如【例题 3-17】程序段中的 FOUND 和 DONE。 JMP SHORT LABEL ,程序转移到 LABEL指明的指令处继续执行。SHORT 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-128~+127。 JMP NEAR LABEL

C语言的整形提升

霸气de小男生 提交于 2020-03-08 13:02:45
1、算术转换   许多运算符都会引发转换,以类似的方式产生结果类型,这个模式称为“寻常算术转换”。   首先,任何类型为char或short的操作数被转换为int,任何类型为float的操作数被转换为double。其次,如果其中一个操作数类型为double,那么另一个操作数被转换为double,计算结果类型也是double。再次,如果其中一个操作数类型为long,那么另一个操作数被转换为long,计算结果类型也为long。或者,其中一个操作数的类型数unsigned,那么另一个操作数被转换为unsigned,计算结果类型也为unsigned。如果不符合上面几种情况,那么两个操作数的类型都为int,计算结果类型也为int。 2、字符和整数   char,short int或int型位段,包括它们的有符号或无符号变形,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。 3、寻常算术转换   许多操作数类型为算术类型的双目运算符会引发转换,并以类似的方式产生结果类型。它的目的是产生一个普遍类型,同时也是运算结果的类型。   首先,如果其中一个操作数的类型是long double,那么另一个操作数也会被转换为long double。其次

c/c++编程排坑(1)-- 数据类型的“安静”转换

家住魔仙堡 提交于 2020-03-08 11:48:21
这里主要介绍ANSI C的特性:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。 一、算术转换(K&R C) 首先: 任何类型为char或short的操作数会被转换为int。 任何类型为float的操作数会被转换成double。 其次: 如果其中一个操作数的类型时double,那么另外一个操作数会被转换成double,计算结果也是double。 如果其中一个操作数的类型时long,那么另外一个操作数会被转换成long,计算结果也是long。 如果其中一个操作数的类型时unsigned,那么另外一个操作数会被转换成unsigned,计算结果也是unsigned。 如果不符合上面几种情况,那么两个操作数的类型都作为int,计算结果也是int。 二、ANSI C的做法 字符和整型(整型升级) char,short int或者int型位段(bit-field),包括他们的有符号和无符号变型,以及枚举类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称之为整型升级。 寻常算术转换 许多操作数类型为算数类型的双目运算符会引发类型转换

signed和unsigned之二

落爺英雄遲暮 提交于 2020-03-08 11:44:32
先看下面一段程序,这段程序摘自《C 专家编程》: #include <stdio.h> int array[] = {23,34,12,17,204,99,16}; #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) int main(void) { int d=-1,x; /*........*/ if(d <= TOTALTOTAL_ELEMENTS - 2) x = array[d+1]; /*........*/ return 0; } 如果是有这样一段程序的话,你永远无法知道x的值到底是多少,因为这句赋值语句x=array[d+1];根本不会执行。原因在哪?经过调试发现程序执行到if语句进行判断完之后,直接跳过下面一条语句的执行。下面来分析一下原因,因为sizeof求算类型大小时的返回值是unsigned int类型,而d是signed int,if语句测试两者大小,d会自动升级为unsigned int,-1转换为unsigned int是一个很大的正整数,所以表达式的值永远为假,因此后面的赋值语句永远不会执行。这里面就是类型转换带来的bug,如果稍不注意,则可能对整个工程或者项目造成无法预测的后果,而这个bug是很难直接调试能够调试得出来的。 表达式中的类型转换 类型转化包括强制类型转化和隐式转换

3.4自动类型转换与强制转换运算符

倾然丶 夕夏残阳落幕 提交于 2020-03-08 10:53:05
3.4.1表达式中的自动类型转换 C编译器在对操作数进行运算之前将所有的操作数都转换成范围较大的操作数类型,称为类型的提升。 3.4.2赋值中的自动类型转换 /*若赋值运算符左侧变量类型和右侧变量类型不一致,将右侧表达式的值转换成左侧变量的类型*/ # include <stdio.h> int main ( ) { int n = 256 ; float f = 3.6 ; double d = 2.5 ; n = f ; f = n ; d = f ; printf ( "n=%d\n" , n ) ; printf ( "f=%f\n" , f ) ; printf ( "d=%f\n" , d ) ; } 输出: n = 3 f = 3.000000 d = 3.000000 3.4.3强制类型转换运算符 /*(类型)表达式*/ # include <stdio.h> int main ( ) { int m = 5 ; printf ( "m/2=%d\n" , m / 2 ) ; printf ( "(float)(m/2)=%f\n" , ( float ) ( m / 2 ) ) ; printf ( "(float)m/2=%f\n" , ( float ) m / 2 ) ; printf ( "m=%d\n" , m ) ; } 输出: m / 2 = 2 (

变量、数据类型和运算符

亡梦爱人 提交于 2020-03-08 07:50:18
变量: 计算机使用内存来记忆大量运算时要使用的数据。根据数据的类型为它在内存中分配一块空间,然后数据就可以放进这块空间中。 通过变量名可以简单快速地找到它存储的数据。将数据指定给变量,就是将数据储存到以别名为变量名的那个房间;调用变量,就是将那个房间中的数据取出来使用。可见,变量是储存数据的一个基本单元,不同的变量相互独立。 声明变量,既“根据数据类型在内存中申请一块空间”,这里需要给变量命名。 数据类型: int 整型 double 双精度符点型 char 字符型 string 字符串型。 不同的数据在存储时所需要的空间各不相同,不同类型的数据就需要不同的内存空间来储存。 变量声明及使用: 根据数据的类型再在内存中申请一块空间,这里需要给变量命名。 将数据存储至对应的内存空间。 调用变量。使用储存的变量,我们称之为“调用变量”。 使用声明的变量名就是使用变量对应的内存空间中存储数据,”变量都必须声明或赋值后才能使用“。 变量命名规则: 1 变量必须以字母、下划线“_”或“$”符号开头; 2 变量可以包括数学,但不能以数字开头; 3 除了“_”或“$”符号以外,变量名不能包含任何特殊字符; 4 不能使用Java语言的关键字,如int、class、public等。 Java变量名的长度没有任何限制,但是Java语言区分大小写,所以price和Price是两个完全不同的变量。