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是有符号的