这几天在整音频相关的东西,无意间发现了一个有趣的事情
java
System.out.println(String.format("0xFF00 + 0xF0 = %04X", (short) ((short) 0xFF00 + (byte) 0xF9)));
显示的结果有点出乎意外,所以我有换成了 C/C++
cpp
short a = 0xFF00; char b = 0xF0; printf("a + b = %X", (short)(a+b));
没错,结果跟 java 的一样,都是 FEF0
一直以来,俺都是尽量不在代码里面显式类型转换的,从教科书上来看,
byte/char 比 short 类型低级,在表达式内部应该会隐式类型转换的
可是换成两个同样是 short 类型的数值相加才能得到希望的结果,这是什么 gui
所以
a + b
是-272
,也即FEF0
。注意char類型的
0xF0
,強制轉換成short後不等於0x00F0
。你需要的是unsigned char。兩個操作數都
小于
int
,將會被同時隱式轉換為int
進行運算,等價於short、byte、int都是有符號的
(int)(short) 0xFF00
的值是0xFFFFFF00
(int)(byte) 0xF0
的值是0xFFFFFFF0
相加的結果就是
0xFFFFFEFO
,溢出了一位,再強制轉換為short
,直接截取出0xFEFO
char的範圍是-128到127,所以0xF0如果是一個signed char, gcc編譯器預設進行了4位元組對齊,前面給補上0xFFFFFFF,而unsigned char的範圍才是0~255,補齊時前面是0.