C++ 为什么在c++;?

C++ 为什么在c++;?,c++,C++,我的印象是,两者都将设置为不同的值,但所有这三个东西都输出完全相同的字符。是否有某种隐式转换正在进行或发生什么 unsigned char unsc1 = 128; std::cout << "Unsigned Char 1 = " << unsc1 << std::endl; signed char sc1 = 128; std::cout << "Signed Char 1 = " << sc1 << std::en

我的印象是,两者都将设置为不同的值,但所有这三个东西都输出完全相同的字符。是否有某种隐式转换正在进行或发生什么

unsigned char unsc1 = 128;
std::cout << "Unsigned Char 1 = " << unsc1 << std::endl;


signed char sc1 = 128;
std::cout << "Signed Char 1 = " << sc1 << std::endl;



char c1 = 128;
std::cout << "Char 1 = " << c1 << std::endl;
无符号字符unsc1=128;

std::cout当您将有符号和无符号字符发送到
cout
时,它们将被解释为
char
。如果希望看到不同的结果,请在打印前将这些值强制转换为
int

unsigned char unsc1 = 128;
std::cout << "Unsigned Char 1 = " << (int)unsc1 << std::endl;


signed char sc1 = 128;
std::cout << "Signed Char 1 = " << (int)sc1 << std::endl;
无符号字符unsc1=128;

我们知道,128不是可打印的ASCII码。所以你的三个陈述都不会有一个字符。至少在我的环境中,gcc版本4.1.2,libc6,x86-64,我认为这是不正确的:

signed char sc1 = 128; // overflow. 有符号字符sc1=128;//溢流
您似乎尝试了某种“未定义的行为”。

它们不是字符串,字符值128等于某个字符。当
char\u BIT
为8 IIRC时,第二个是UB。我很确定初始化“溢出”计数,对吗?@chris我需要检查一下标准,但我认为你是对的。@dasblinkenlight,我认为我错了,它是按照§4.7[conv.integral]/3定义的实现。@chris:没错-从无符号到有符号的转换是实现定义的,但有符号溢出(即算术运算的结果)未定义。@chris You's right-我自己刚刚找到了4.7.3部分(“如果目标类型是有符号的,则如果可以在目标类型(和位字段宽度)中表示,则该值不变;否则,该值是实现定义的。”)如果您还没有看到,请注意代码为128的字符有多种可能。例如,在Windows 1252中,它是€。在UTF-8中,它是一个控制字符。