>  Q&A  >  본문

java - short + byte 出现奇怪的事情

这几天在整音频相关的东西,无意间发现了一个有趣的事情

javaSystem.out.println(String.format("0xFF00 + 0xF0 = %04X",
        (short) ((short) 0xFF00 + (byte) 0xF9)));

显示的结果有点出乎意外,所以我有换成了 C/C++

cppshort a = 0xFF00;
char b = 0xF0;
printf("a + b = %X", (short)(a+b));

没错,结果跟 java 的一样,都是 FEF0

一直以来,俺都是尽量不在代码里面显式类型转换的,从教科书上来看,
byte/char 比 short 类型低级,在表达式内部应该会隐式类型转换的

可是换成两个同样是 short 类型的数值相加才能得到希望的结果,这是什么 gui

PHPzPHPz2764일 전398

모든 응답(3)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 13:16:52

    short a = 0xFF00; // -256
    char b = 0xF0; // -16;
    

    所以a + b-272,也即FEF0
    注意char类型的0xF0,强制转型成short后不等于0x00F0。你需要的是unsigned char。

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 13:16:52

    两个操作数都小于 int,将会被同时隐式转换为int进行运算,等价于

    (short) ((int)(short) 0xFF00 + (int)(byte) 0xF0))
    

    short、byte、int都是有符号的

    (int)(short) 0xFF00的值是 0xFFFFFF00
    (int)(byte) 0xF0的值是 0xFFFFFFF0

    相加的结果就是0xFFFFFEFO,溢出了一位,再强制转换为short,直接截取出0xFEFO

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:16:52

    char的范围是-128到127,所以0xF0如果是一个signed char, gcc编译器默认进行了4字节对齐,前面给补上0xFFFFFFF,而unsigned char的范围才是0~255,补齐时前面是0.

     #include <stdio.h>
    
    int main(){
       unsigned char b1 = 0xF0;
       printf("unsigned char b is %X, print value is %X\n", b1, b1&0xFF);
       char b2 = 0xF0;
       printf("signed char b is %X, print value is %X\n", b2, b2&0xFF);
       unsigned short a = 0xFF00;
       unsigned char b = 0xF0;
       printf("a + b = %X\n", (unsigned short)(a+b));
    }
    
    输出
    unsigned char b is F0, print value is F0
    signed char b is FFFFFFF0, print value is F0
    a + b = FFF0
    看最后一个输出
    

    회신하다
    0
  • 취소회신하다