我读到可以使用“char”表示小整数。但是,当我尝试时,
unsigned char A = 4;
std::cout << A << std::endl;
它给出了一个角色,而不是4.
答案 0 :(得分:18)
您遇到的是运算符重载的影响。 <<
运算符假定,当您将字符设为char
类型的变量时,您最有可能要打印字符,因此它的行为与您对整数变量的预期不同
根据Vivek Goel的建议,您可以强制编译器选择您真正想要的重载:
unsigned char A = 4;
std::cout << static_cast<unsigned int>(A) << std::endl;
附录:除非您正在处理资源严重受限的环境(尤其是小内存),否则您将在错误的一端进行优化。 unsigned int
上的操作通常比unsigned char
上的操作快,因为您的处理器无法获取单个字节,但必须至少获得4的倍数并屏蔽其他3个字节。
答案 1 :(得分:6)
operator<<
和(std::ostream
/ signed
)unsigned
执行字符输出的char
重载;为了输出字符的整数值,您需要执行强制转换:
std::cout << (int)A << std::endl;
然而,这就是所谓的“旧式”(更具体地说是C风格)演员。 C ++具有更明确,更易于搜索的投射操作符,通常更受欢迎:
std::cout << static_cast<int>(A) << std::endl;
但打字很麻烦;惯用的替代方法是使用+
运算符,该运算符将其参数提升为(unsigned
)int
:
std::cout << +A << std::endl;
这是你应该使用的。
答案 2 :(得分:4)
应该是
unsigned char A = 4;
std::cout << (int)A << std::endl;
答案 3 :(得分:4)
char IS 一个小整数(范围-127到+127),它与整数相同的整数运算。
这里的问题是内部表示(表示-127到+127范围的二进制数)与外部表示之间的概念混淆,通常使输入和输出函数将其表示为“字形”其ASCII码是由它携带的数字“,而对于整数,外部表示是”读取的字符序列,如十进制表示的整数“
将其作为数字打印的最简单方法是将其转换为int
,然后将其转换为输出函数(如cout << int(ch)
或任何等效的转换形式)
答案 4 :(得分:1)
对于单个对象,代码大小的增加可能会淹没任何存储大小的减少(对齐填充可能需要跟随对象的内存)。除非您需要大量的小整数,否则请使用int
。