Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2603253
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: IT业界

2014-12-04 14:11:20


#include
#include


#define IN
#define OUT
typedef unsigned char BYTE;


static void sTringToChar(IN BYTE * pbIn, OUT BYTE * pbOut)
{
BYTE bvar,foo;
BYTE temp1,temp2;
// strupr(pbIn);
bvar = strlen(pbIn);
for(foo = 0; foo < (bvar >> 1); ++foo)
{
// *(pbOut + foo) = (  ( (*(pbIn + foo * 2) - 0x30) << 4) | ( (*(pbIn + foo * 2 + 1) - 0x30) ) ) ;
if(*(pbIn + foo * 2) < 'A' )
temp1 = (*(pbIn + foo * 2) - 0x30) << 4;
else
temp1 = ( (*(pbIn + foo * 2) - 0x41) + 0x0A) << 4;
if(*(pbIn + foo * 2 + 1) < 'A' )
temp2 = *(pbIn + foo * 2 + 1) - 0x30;
else
temp2 = (*(pbIn + foo * 2 + 1) - 0x41) + 0x0A;


*(pbOut + foo) = temp1 | temp2;
}

for(foo = 0; foo < 19; ++foo)
printf("the In_tmep is %02x\n",pbOut[foo]);
}
/*
int main(void)
{
char foo;
char * pcmd = "00A404000E315041592E5359532E4444463031";
char btemp[19] = {0};
// BYTE btemp[19] = {0};


sTringToChar(pcmd, btemp);


for(foo = 0; foo < 19; ++foo)
printf("the btmep is %02x\n",btemp[foo]);
return 0;
}
*/


/*
int main(void)
{
char temp[4] = {0};
BYTE var = (0x01 << 4);
temp[0] = var;
printf("the temp is %02x\n",temp[0]);


}
*/


int main(void)
{
char bar = (char)0x80;
unsigned char var = 0x01;
// unsigned int foo;
// unsigned char foo;
char foo;
foo = bar + var;
printf("THE value is %x\n", foo);


return 0;
}

printf的参数会有类型提升
unsigned char值是0x81,提升到int还是0x81
char的值0x81其实是-127,提升到int后还是-127,就是ffffff81


 0x81没超出unsigned char的范围
14:02:38
C/C++--小陈 2014/12/4 星期四 14:02:38

int main(void)
{
char bar = (char)0x80;
BYTE var = 0x01;
unsigned int foo;
foo = bar + var;
printf("THE value is %x\n", foo);

return 0;
}

C/C++--小陈 2014/12/4 星期四 14:02:43

这样验证比较合理
aeris
2014/12/4 星期四 14:03:34

那么麻烦做啥

C/C++--小陈 2014/12/4 星期四 14:03:43

那怎么办?
冒. 。o 〇泡
2014/12/4 星期四 14:03:51

typeid多直接
aeris
2014/12/4 星期四 14:04:00

$ cat e.cpp && g++ e.cpp
int main() {
        unsigned char c1 = 15;
        char c2 = 20;

        const char *p = c1 + c2;
        return 0;
}
e.cpp: In function ‘int main()’:
e.cpp:5:21: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
  const char *p = c1 + c2;
                     ^
[...]SS-X
2014/12/4 星期四 14:04:04

最后验证出啥了
aeris
2014/12/4 星期四 14:04:11

e.cpp:5:21: error: invalid conversion from ‘int’ to ‘const char*’

C/C++--小陈 2014/12/4 星期四 14:04:18

int main(void)
{
char bar = (char)0x80;
BYTE var = 0x01;
// unsigned int foo;
char foo;
foo = bar + var;
printf("THE value is %x\n", foo);

return 0;
}

C/C++--小陈 2014/12/4 星期四 14:04:27



C/C++--小陈 2014/12/4 星期四 14:04:31

看结果?

C/C++--小陈 2014/12/4 星期四 14:04:35

这是为什么?
aeris
2014/12/4 星期四 14:04:34

const char *p = c1 + c2;

$ cat e.cpp && g++ e.cpp
int main() {
        unsigned char c1 = 15;
        char c2 = 20;

        const char *p = c1 + c2;
        return 0;
}
e.cpp: In function ‘int main()’:
e.cpp:5:21: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
  const char *p = c1 + c2;
                     ^
14:04:46
C/C++--小陈 2014/12/4 星期四 14:04:46

foo为 char类型的

C/C++--小陈 2014/12/4 星期四 14:04:50

不解?
冒. 。o 〇泡
2014/12/4 星期四 14:05:06

char bar = (char)0x80;
BYTE var = 0x01;
// unsigned int foo;
char foo;
foo = (char)((int)bar + (int)var);
printf("THE value is %x\n", (int)foo);
aeris
2014/12/4 星期四 14:05:10

        unsigned char c1 = 15;
        char c2 = 20;

        const char *p = c1 + c2;

e.cpp:5:21: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
  const char *p = c1 + c2;

这样多直接
冒. 。o 〇泡
2014/12/4 星期四 14:05:12

实际执行顺序
aeris
2014/12/4 星期四 14:05:37

编译器报告 不能从int转换为const char *
冒. 。o 〇泡
2014/12/4 星期四 14:05:38

char提升为int
aeris
2014/12/4 星期四 14:05:45

说明两个char相加的结果是int

C/C++--小陈 2014/12/4 星期四 14:06:11

int main(void)
{
char bar = (char)0x80;
unsigned char var = 0x01;
// unsigned int foo;
// unsigned char foo;
char foo;
foo = bar + var;
printf("THE value is %x\n", foo);

return 0;
}

2014/12/4 星期四 14:06:20

integer promotion
14:06:49
aeris
2014/12/4 星期四 14:06:49

你要确定一个东西是什么类型,可以随便赋值给一个类型的变量,这样编译就会出错,出错信息里面,编译器自然会告诉你,不能把XXX转换为YYY类型,你自然知道是什么类型了
冒. 。o 〇泡
2014/12/4 星期四 14:06:53

printf的时候foo提升为int

C/C++--小陈 2014/12/4 星期四 14:07:00

为什么// unsigned char foo;  输出 0x81
char foo;输出ffffff81
aeris
2014/12/4 星期四 14:07:17

printf的参数会有类型提升
aeris
2014/12/4 星期四 14:07:35

unsigned char值是0x81,提升到int还是0x81

C/C++--小陈 2014/12/4 星期四 14:07:50

unsigned char 的参数类型不会提升了?
朱泙漫
2014/12/4 星期四 14:08:06

会提升
可是值没变呗
aeris
2014/12/4 星期四 14:08:10

char的值0x81其实是-127
aeris
2014/12/4 星期四 14:08:18

提升后还是-127
Pilifischy
2014/12/4 星期四 14:08:30

%x 你是这个输出的啊
aeris
2014/12/4 星期四 14:08:34

就是ffffff81
14:09:08
aeris
2014/12/4 星期四 14:09:08

printf的参数会有类型提升
unsigned char值是0x81,提升到int还是0x81
char的值0x81其实是-127,提升到int后还是-127,就是ffffff81

C/C++--小陈 2014/12/4 星期四 14:09:34



C/C++--小陈 2014/12/4 星期四 14:09:40

原来是这样
aeris
2014/12/4 星期四 14:09:54

标准并没有规定char是有符号还是无符号的,从这里可以看出你的编译器默认char是有符号的 






阅读(1092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~