在下文中,我将二进制数15编码为unsigned char,然后将其转换为int。但是,当我用int8_t替换int时,它不再输出15。我不明白为什么。是不是int8_t 8位的大小,所以它应该与char匹配得很好,char也是8位?
#include <iostream>
#include <string.h>
int main()
{
unsigned char binValue = 0<<7 | 0<<6 | 0<<5 | 0<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0; // this is 15 in binary
int intValue = (int)binValue;
// memcpy(&intValue,&binValue,sizeof(int)); // Or this one
std::cout << intValue << std::endl;
return 0;
}
答案 0 :(得分:3)
你所看到的(实际上你看不到的)是cout
,当int8_t
被用时,将值解释为字符,而ASCII码15可能不会离开调试控制台上可见的任何内容。请注意,环境(例如我的)可能会定义int8_t
,如下所示:
// _int8_t.h:
#ifndef _INT8_T
#define _INT8_T
typedef __signed char int8_t;
#endif /* _INT8_T */
如果您将binValue
更改为47
,那么您会看到'/'
。
要将字符类型(或int8_t
)打印为十进制,请在打印过程中将其转换为int:
int main()
{
unsigned char binValue = 0<<7 | 0<<6 | 1<<5 | 0<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0;
// changed to 47 for demonstration purpose
int8_t intValue = (int8_t)binValue;
std::cout << "as char:" << intValue << std::endl;
std::cout << "as decimal:" << (int)intValue << std::endl;
std::cout << "as decimal:" << +intValue << std::endl;
return 0;
}