作者wtchen (没有存在感的人)
看板C_and_CPP
标题[问题] unsigned char 转成 char
时间Fri Feb 5 02:01:47 2016
开发平台(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...
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 86.200.141.244
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1454608909.A.419.html
1F:→ pikachu2421: char没有定义一定是signed或unsigned 会受环境影响 02/05 04:17
2F:→ pikachu2421: 要确定是signed就宣告signed char 02/05 04:17
3F:推 LPH66: 楼上正确, 而且事实上 char, signed char, unsigned char 02/05 05:04
4F:→ LPH66: 这是三种型别, 不是两种; char 虽然会二选一但不等同於他们 02/05 05:05
5F:→ wtchen: 那请问char会怎麽决定自身是unsigned 还是signed? 02/05 05:22
6F:推 flere: 由compiler来决定的 02/05 07:36
7F:→ dorgonman: cppflag可以设参数强制要用那一个 02/06 18:35
8F:→ dorgonman: -funsigned-char or -fsigned-char 02/06 18:36
9F:→ wtchen: 感谢~~ 02/06 21:20