[问题] unsigned char 转成 char

楼主: wtchen (没有存在感的人)   2016-02-05 02:01:47
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
- Lubuntu 15.10 + gcc 5.2.1
- Raspbian + gcc 4.9.2
问题(Question):
我正在测试用RF module接收讯号然后转成我要的char variable
大概是这样:
输入值:unsigned char (前4bit跟后4bit各代表数值a, b)
输出值:两个signed char
喂入的资料(Input):
unsigned char varible (0-255)
预期的正确结果(Expected Output):
char varible (-128-127)
错误结果(Wrong Output):
我用笔电+gcc 5.2.1跑出来数值是正确的
0, 0, 0, -1, -1
0, 1, 16, -1, 0
0, 2, 32, -1, 1
0, 3, 48, -1, 2
0, 4, 64, -1, 3
1, 0, 1, 0, -1
1, 1, 17, 0, 0
1, 2, 33, 0, 1
1, 3, 49, 0, 2
1, 4, 65, 0, 3
2, 0, 2, 1, -1
2, 1, 18, 1, 0
2, 2, 34, 1, 1
2, 3, 50, 1, 2
2, 4, 66, 1, 3
3, 0, 3, 2, -1
3, 1, 19, 2, 0
3, 2, 35, 2, 1
3, 3, 51, 2, 2
3, 4, 67, 2, 3
4, 0, 4, 3, -1
4, 1, 20, 3, 0
4, 2, 36, 3, 1
4, 3, 52, 3, 2
4, 4, 68, 3, 3
可是用RPi + gcc 4.9跑出来变成unsigned char
0, 0, 0, 255, 255 -> 255 应该是unsigned char才有可能
0, 1, 16, 255, 0
0, 2, 32, 255, 1
0, 3, 48, 255, 2
0, 4, 64, 255, 3
1, 0, 1, 0, 255
1, 1, 17, 0, 0
1, 2, 33, 0, 1
1, 3, 49, 0, 2
1, 4, 65, 0, 3
2, 0, 2, 1, 255
2, 1, 18, 1, 0
2, 2, 34, 1, 1
2, 3, 50, 1, 2
2, 4, 66, 1, 3
3, 0, 3, 2, 255
3, 1, 19, 2, 0
3, 2, 35, 2, 1
3, 3, 51, 2, 2
3, 4, 67, 2, 3
4, 0, 4, 3, 255
4, 1, 20, 3, 0
4, 2, 36, 3, 1
4, 3, 52, 3, 2
4, 4, 68, 3, 3
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
int main(void) {
unsigned char a, b, c;
char d,e;
for (a=0; a<5; ++a) {
for (b=0; b<5; ++b) {
c = (b<<4)+a;
d = (char) (c&0xF) -1 ;
e = (char) ((c>>4) & 0xF) -1;
printf("%d, %d, %d, %d, %d\n", a,b,c,d,e);
}
}
return 0;
}
补充说明(Supplement):
请问这是gcc 4.9的bug吗?
我不知道是不是该换成gcc5...
作者: pikachu2421 (皮卡@めぐ民)   2016-02-05 04:17:00
char没有定义一定是signed或unsigned 会受环境影响要确定是signed就宣告signed char
作者: LPH66 (-6.2598534e+18f)   2016-02-05 05:04:00
楼上正确, 而且事实上 char, signed char, unsigned char这是三种型别, 不是两种; char 虽然会二选一但不等同于他们
楼主: wtchen (没有存在感的人)   2016-02-05 05:22:00
那请问char会怎么决定自身是unsigned 还是signed?
作者: flere (人间失格)   2016-02-05 07:36:00
由compiler来决定的
作者: dorgonman (dorgonman)   2016-02-06 18:35:00
cppflag可以设参数强制要用那一个-funsigned-char or -fsigned-char
楼主: wtchen (没有存在感的人)   2016-02-06 21:20:00
感谢~~

Links booklink

Contact Us: admin [ a t ] ucptt.com