精华内容
下载资源
问答
  • 1、无符号和有符号计算机中用补码表示负数,并且有一定的计算方式;另外,用二进制的最高位表示符号,0表示正数、1表示负数。这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字符类型...

    1、无符号和有符号

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

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

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

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

    08742bc01e4768a88362be857e170fe0.png

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

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

    无符号数:1111 1111值:255=1*2^7+1*2^6+.....=2^n-1

    有符号数:0111 1111值:127

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

    3ce4e14beec74fdd843ee7a171d1c1a3.png

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

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

    2ba904552cb9635cf474c5134600c128.png

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

    5fe4a2837b61a46e7d2f9231d8515763.png

    2、 Java基本数据类型

    8e57262ce664834067bfcb66233b1588.png

    4a33659569965caa6ba986d86e37d0c3.png

    3、 Java的符号类型

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

    1 int toUnsigned(shorts) {2 return s & 0x0FFFF;3 }

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

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

    1 System.out.println(0x80);//128

    2 //0x81看作是int型,最高位(第32位)为0,所以是正数

    3 System.out.println(0x81);//129

    4 System.out.println(0x8001);//32769

    5 System.out.println(0x70000001);//1879048193

    6 //字面量0x80000001为int型,最高位(第32位)为1,所以是负数

    7 System.out.println(0x80000001);//-2147483647

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

    9 System.out.println(0x80000001L);//2147483649

    10 //最小int型

    11 System.out.println(0x80000000);//-2147483648

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

    13 System.out.println(0x8000000000000000L);//-922337203685477

    4、 有符号扩展和无符号扩展

    System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));// cafebabe

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

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

    值相加得到了0:

    0x ffffffffcafebabeL

    +0x 0000000100000000L

    -----------------------------

    0x 00000000cafebabeL

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

    展符号位就为0:

    1 System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));//1cafe

    5、 窄数据类型提升至宽数据类型时是使用符号位扩展还是零扩展

    System.out.println((int)(char)(byte)-1);//65535

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

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

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

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

    使用一个位掩码:

    1 int i = c & 0xffff;//实质上等同于:int i = c ;

    说明:

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

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

    System.out.println(0x80000001);//-2147483647 ,已经是32位,最高位是符号位

    System.out.println(0xcafebabe);//-889275714

    System.out.println(0xffff); //65535 int是32位的,最高位已经是0,相当于0X0000ffff

    System.out.println(0xff); //255

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

    2 int i = (short)c;

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

    3 char c = (char)(b & 0xff);//char c = (char) b;为有符号扩展

    6、 ((byte)0x90==0x90)?

    答案是不等的,尽管外表看起来是成立的,但是它却等于false。为了比较byte数值(byte)0x90和int数值0x90,Java

    通过拓宽原生类型将byte提升为int,然后比较这两个int数值。因为byte是一个有符号类型,所以这个转换执行的是符号扩展,将负的byte数值提升为了在数字上相等的int值(11111111     11111111    11111111  10010000)。在本例中,该转换将(byte)0x90提升为int数值-112,它不等于int数值的0x90,即+144。

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

    1 ((byte)0x90 & 0xff)== 0x90

    7、 java中byte转换int时与0xff进行运算的原因

    java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码

    public static String bytes2HexString(byte[] b) {

    String ret= "";for (int i = 0; i < b.length; i++) {

    String hex= Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {

    hex= '0' +hex;

    }

    ret+=hex.toUpperCase();

    }returnret;

    }

    上面是将byte[]转化十六进制的字符串,注意这里b[i] & 0xFF将一个byte和0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出

    b[i] & 0xFF运算后得出的仍然是个int,那么为何要和0xFF进行与运算呢?直接Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.

    其原因在于:

    1.byte的大小为8bits而int的大小为32bits

    2.java的二进制采用的是补码形式

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

    byte是一个字节保存的,有8个位,即8个0、1。8位的第一个位是符号位,也就是说0000 0001代表的是数字1

    1000 0000代表的就是-1所以正数最大位0111 1111,也就是数字127负数最大为1111 1111,也就是数字-128

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

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

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

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

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

    8、 DataInputStream

    DataInputStream in = newDataInputStream(new BufferedInputStream(fileInputStream));

    展开全文
  • 这是不好的风格,并且Java中的任何标识符中使用$可能有风险.它的风险在于$字符被保留用于使用Java工具链和第三方语言工具.> Java编译器在内部类和嵌套类的“内部”类名中使用它.它由Java编译器以合成属性的名称...

    这是不好的风格,并且在Java中的任何标识符中使用$可能有风险.它的风险在于$字符被保留用于使用Java工具链和第三方语言工具.

    > Java编译器在内部类和嵌套类的“内部”类名中使用它.

    它由Java编译器以合成属性的名称使用.

    >它可以被第三方代码生成器(例如注释处理器)用于各种目的.

    >它可以被目标为JVM平台的其他语言使用,并且可能需要与您的代码共存.

    您现在可能不会有一个简单的$classname的技术问题(至少对于标准的Java工具链).但是,将来会有变化的可能性:

    >他们保留改变这一点的权利.

    >在_示例中有一个这样做的先例.

    如果真的,真的需要一个单字符的类名,最好是安全地使用F或Z,或者其他不保留的东西.

    但是说实话,我觉得你最好试图实现(或只是使用)一个真正的功能语言,而不是把一个功能性的编程“系统”变成Java.或者也许,只是在正式发布之前切换到Java 8. “Cos我为一个拒绝阅读/维护一个看起来像jquery的Java代码库.

    I don’t mean to create a functional lib for Java, just want to create a lib to maintain some common utilities I used. Again, I am a advocate of minimalism and feel suck with things like apache commons. The functional stuff is added to help me easier to manipulate collection(s).

    如果是你的代码,你可以做你喜欢的事情.做出自己的决定.根据你的意见行事成为“冒险者”… :-). (我们对$,etcetera …的建议是无可奈何的)

    但是,如果您为客户或雇主编写此代码,或是为了创建(可行)开源产品,则需要考虑其他人的意见.例如,如果您在其他地方找到更好的薪水工作,您的老板就需要知道如何维护您的代码.一般来说,下一个人能否弄清楚,保持你的代码,新鲜等等,否则将被委托给垃圾箱?

    展开全文
  • JAVA 小于符号问题

    千次阅读 2008-10-20 09:28:00
    |||没有这种功能吧 |||是移位运算|||后面的分号有可能是中文状态的分号|||你要用HTML写出这两个东西么 |||不知道你是不是要這個 软键盘还可能 |||支持楼主们 是不是ULTREDIT设置有问题 |||语法上看没...否则的话 并且
    
    
    |||
    没有这种功能吧  
    
    
    |||
    <<是移位运算
    
    
    |||
    后面的分号有可能是中文状态的分号
    
    
    |||
    你要用HTML写出<>这两个东西么  
    
    
    |||
    不知道你是不是要這個  软键盘还可能 
    
    
    |||
    支持楼主们 
    是不是ULTREDIT设置有问题  
    
    
    |||
    语法上看没问题啊  编译器报的什么错 否则的话  并且是半角模式
    
    
     记得用英文输入法 你得找个人现场给你看看 &lt; <&gt; >
    
    
    |||
    是不是打了全角符号进去 这个ULTREDIT要跟具体的编译器结合起来才能编译代码吧    2楼说的就是这个 &lt; &gt;你把这个加在BODY里面看看效果吧
    
    
    |||
    全角半角的问题或者是中文输入跟英文输入问题  你有没有装jre或者jdk呢 
    展开全文
  • 生活发生的一切,才会促使着我继续前行,今天继续更新哦,看书中的代码练习。 ... ... import java.util.Date;...//需要引入类库,并且配置ClassPath环境变量中添加该代码目录树的根目录 import static net.mindview...

    生活发生的一切,才会促使着我继续前行,今天继续更新哦,看书中的代码练习。

    例子1  引入net.mindview.util.Print.* ,方便打印结果。

    package com.date0529;

    import java.util.Date;

    //需要引入类库,并且配置ClassPath环境变量中添加该代码目录树的根目录

    import static net.mindview.util.Print.*;

    public class Test_0529_Demo01 {

        public static  void main(String[] args) {

            print("Hello. it's: ");

            print(new Date());

        }

    }

    例子2 运算符号的优先级

    public class Test_0529_Demo02 {

        public static void main(String[] args){

            int x=1,y=2,z=3;

            int a=x+y-2/2+z;//(1)

            int b=x+(y-2)/(2+z);//(2)

            System.out.println("a="+a+"  b="+b);

        }

    }

    运算结果如下:

     

     

    例子3 对象的赋值 t1赋值,之前的t1对对象的引用已经被垃圾回收清除掉,现在t1,t2指向的是相同的对象。如果要保留t1,t2独立,可以t1.level = t2.level 这样赋值

        public class Test_0529_Demo03 {

            public static  void main(String[] args){

                Tank t1 = new Tank();

                Tank t2 = new Tank();

                t1.level = 9;

                t2.level = 51;

                System.out.println("1: t1.level "+t1.level+" t2.level "+t2.level );

                t1 = t2;

                System.out.println("2: t1.level "+t1.level+" t2.level "+t2.level );

                t1.level = 23;

                System.out.println("3: t1.level "+t1.level+" t2.level "+t2.level );

                t2.level = 100;

                System.out.println("3: t1.level "+t1.level+" t2.level "+t2.level );

    }

    }

     运算结果如下:

     

     

    例子4 方法调用中的别名

    package com.date0529;

     

    class Letter{

        char c;

    }

    public class Test_0529_Demo04 {

        /**

         * 方法调用的别名问题,这里f()方法实际上只是传递了一个引用

         * @param y

         */

        static  void f(Letter y){

            y.c = 'z';

        }

        public  static void main(String[] args){

            Letter x = new Letter();

            x.c = 'a';

            System.out.println("1: x.c: " +x.c );

            f(x);

            System.out.println("2: x.c: " +x.c );

        }

    }

    运算结果如下:

     

     

     

    例子5  算数操作符  自增和自减要好好理解下,自增在前则是先执行加同理在后后执行加

    package com.date0529;

     

    import java.util.Random;

     

    /**

     * 算数操作符

     */

    public class Test_0529_Demo05 {

        public  static void main(String[] args){

            //创造一个随机数

            Random rand = new Random(47);

            int i, j, k;

            //选择一个1100之间的数

            j = rand.nextInt(100) + 1;

            System.out.println("j: " + j);

            k = rand.nextInt(100) + 1;

            System.out.println("k: " + k);

            i = j + k;

            System.out.println("j+k: " + i);

            i = j - k;

            System.out.println("j-k: " + i);

            i = j / k;

            System.out.println("j/k: " + i);

            i = j * k;

            System.out.println("j*k: " + i);

            i = j % k;

            System.out.println("j%k: " + i);

            j %= k;

            System.out.println("j %= k: " + j);

     

            float u, v, w;

            v = rand.nextFloat();

            System.out.println("v: " + v);

            w = rand.nextFloat();

            System.out.println("w: " + w);

            u = rand.nextFloat();

            System.out.println("u: " + u);

            u = v + w;

            System.out.println("v+w: " + u);

            u = v - w;

            System.out.println("v-w: " + u);

            u = v / w;

            System.out.println("v/w: " + u);

            u = v * w;

            System.out.println("v*w: "+ u);

     

            u += v;

            System.out.println("u +=: " + u);

            u -= v;

            System.out.println("u -=: " + u);

            u *= v;

            System.out.println("u *=: " + u);

            u /= v;

            System.out.println("u /=: " + u);

     

            int m = 1;

            System.out.println("m: " + m);

            System.out.println("m++: "+ m++);

            System.out.println("++m: " + ++m);

            System.out.println("--m: " + --m);

            System.out.println("m--: " + m--);

            System.out.println("m: " + m);

        }

    }

    运算结果如下:

     

     

    转载于:https://www.cnblogs.com/zhishifx/p/9106117.html

    展开全文
  • 开关下的“Intent”一词变为红色,并且出现“无法找到符号类Intent”的错误有人可以向我解释发生了什么以及如何解决这个问题?这是我在AlarmListActivity.java下的代码的最后一部分@Overridepublic boolean ...
  • 本文档为个人博客文档系统的备份版本、作者:小游、作者博客:点击访问 ...使用别人的库 使用 org.apache.commons.lang.StringUtils 中的 join 函数。 StringUtils.join(array, "-") ... Joiner.on('-').joi.
  • 在Android中,用户往往会把所有的字符串保存在string.xml中,目的是方便统一管理,并且利于国际化,但是在这些字符串中直接输入一些符号是不起任何效果的,比如空格,换行,大于号小于号等,这就需要使用转义字符来...
  • 《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、... Java语言规定标识符由字母、下划线、美元符号和数字组成,并且第一个字符不能是 __________2. Java中整型变量有byte、shor...
  • 计算机里面有符号数和无符号数字表示都是一样的,并且对于加法或者减法这些通用的操作都于两类数字都是一样的,并且intel32的处理器里面还有一个EFLAGS标志寄存器里面有两个标志符CF用来表示无符号计算的溢出,OF...
  • 计算机中用补码表示负数,并且有一定的计算方式;另外,用二进制的最高位表示符号,0表示正数、1表示负数。这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字符类型的-1二进制表示是...
  • 编译过程中,每当识别出一个新名字,就将它加入符号表中,并且在词法分析和语法语义分析阶段会陆续填入该名字的有关信息,这些信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查和产生...
  • 在mybatis执行sql编译之前,使用java代码拦截该sql并拼接入条件进去,比如xml里一条sql SELECT * FROM TABLE,在执行这条sql语句之前动态使用java代码加入 WHERE ID > 1这一个条件,并且不能不适用${}传入,也就是...
  • 使用IDEA时,导入新项目slf4j注解及实体类的get/...万万没想到,运行又出错,找不到与lombok相关类的符号,解决一个问题又来一个,通过找无数个答案,结果发现是IDEA自动给我配置了JDK10,马上改成JDK8,完美解决问题。
  • 1.无符号和有符号计算机中用补码表示负数,并且有一定的计算方式;另外,用二进制的最高位表示符号,0表示正数、1表示负数。这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字符类型的...
  • Java 正则表达式详解正则表达式是由普通字符(如英文...符号定义基本书写符号符号符号示例解释匹配输入\转义符\*符号“*”*[ ]可接收的字符列表[efgh]e、f、g、h中的任意1个字符e、f、g、h[^]不接收的字符列表[^ab...
  • java执行顺序:被static修饰的字段或方法在类加载时立即运行,构造方法调用时先调用父类的构造方法(因为super()),其次加载字段,最后执行语句工具使用Editplus:配置细节:编译和运行的原理:编译:当鼠标光标处于哪个...
  • java中无符号类型的解决方案

    千次阅读 2017-03-15 17:09:38
    计算机中用补码表示负数,并且有一定的计算方式;另外,用二进制的最高位表示符号,0表示正数、1表示负数。这种说法本身没错,可是要有一定的解释,不然它就是错的,至少不能解释,为什么字符类型的-1二进制表示是...
  • 最近想把自己以前有过的一些好想法记下来, 用的还不是很顺手所以就决定发在知乎上了,以后大概会慢慢更新,毕竟不是什么时候脑子都好用(这些...1.设 遍历以自然数为底及指数(大于 )的,所有可能的乘幂,并且每...
  • Java语言输表格,多出来的文字,省略并且加上...符号,请问怎么能实现呢,我要代码!
  • 但是其它语言,如c的unsigned short 无符号数,它值的范围就是要从0开始,并且java的short类型保存的数据范围更大。 在实际开发中,可能要与c写的硬件接口,网络接口相互直接数据交互,此时由于j...
  • 问题    接上一篇文章中提到的问题:为什么java要求每个.java文件中最多只能有一个public类,并且文件名称还要和这个public类的名字保持一致呢?这个问题其实可以分为三个子问题:     1. 为什么要以类名来...
  • select * from tablename where id = #{id}假设id的值为12,其中如果数据库字段id为字符型,那么#{id}表示的就是'12',如果id为整型,那么id就是12,并且MyBatis会将上面SQL语句转化为jdbc的select * from tablename...
  • C或C实现当然可以提供类似大小的类型,但是大多数实现都不会遇到它们,并且(2)大多数处理器不支持对这些类型的直接操作 .如果您尝试将这些整数用作二进制标志组,请考虑使用 std::bitset 作为其他答案的建议 . 这...
  • 展开全部Java也提供62616964757a686964616fe59b9ee7ad9431333431366265了一个byte数据类型,并且是基本类型。java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,也就是signed byte。byte,即字节,...
  • 1 \\ 反斜杠2 \t 间隔 ('\')3 \n 换行 ('\')4 \r 回车 ('\')5 \d 数字 等价于[0-9]6 \D 非数字 等价于[^0-9]7 \s 空白符号 [\t\n\x0B\f\r]8 \S 非空白符号 [^\t\n\x0B\f\r]9 \w 单独字符 [a-zA-Z_0-9]10 \W 非单独...
  • java - Spring中的@ Component,@ Repository和@Service注释有什么区别?@Service,@Component和@Service注释可以在Spring中互换使用,或者它们除了作为符号设备之外还提供任何特定功能吗?换句话说,如果我有一个...
  • 我编写了几个程序,我编写了一些程序,... “错误:找不到符号”.并且错误是在其他类的构造函数中应该如何构造那里.例:Chat.java:11 error: cannot find symbolFrame frm = new Frame();^Symbol: class Framelocation...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,965
精华内容 786
关键字:

java并且符号

java 订阅