C++ 为什么这个代码的输出是FFFFF9? intmain(){ 字符c=0371; cout

C++ 为什么这个代码的输出是FFFFF9? intmain(){ 字符c=0371; cout,c++,C++,如果系统上的char类型是有符号的,则值0xf9是一个负数(具体来说是-7)。因此,当您将其转换为整数时,它将为整数提供数值-7,该数值具有十六进制表示0xFFFFFFF9(如果您使用有符号的32位整数表示) 如果您明确地使字符值为无符号char < /> >,则C++将其转换为正值249,它具有十六进制表示0x00 000 f9 ./p>< p的等效整数值249。如果系统上的“代码> char < /C> >类型,则值0xf9是负数(具体地,它是-7)。。因此,当您将其转换为整数时,它将为该整

如果系统上的
char
类型是有符号的,则值0xf9是一个负数(具体来说是-7)。因此,当您将其转换为整数时,它将为整数提供数值-7,该数值具有十六进制表示0xFFFFFFF9(如果您使用有符号的32位整数表示)


如果您明确地使字符值为<代码>无符号char < /> >,则C++将其转换为正值249,它具有十六进制表示0x00 000 f9 ./p>< p的等效整数值249。如果系统上的“代码> char < /C> >类型,则值0xf9是负数(具体地,它是-7)。。因此,当您将其转换为整数时,它将为该整数提供数值-7,该数值具有十六进制表示0xFFFFF9(如果您使用的是有符号32位整数表示)


如果你明确地让你的字符值为<代码>无符号char < />代码,那么C++将它转换成正值249,它具有十六进制表示0x00 00 f9的等价整数值249。由于其初始值的高位设置为1,因此额外的位也设置为1。转换为int的位是符号扩展。

char
可能有符号,也可能没有符号。
0371
不适合
signed char
。请注意,出于某种原因,您使用的是八进制文字,其值为11111 001。如果是负值,则符号扩展为1111…11111 001。这是十六进制的FFFFFF 9。也许你真的不打算使用八进制。@FrançoisAndrieux:
0371
0x371
不同,你的8位
char
是有符号的,并且在输出到控制台之前被符号扩展为32位有符号的
int
。因为它的初始值设置了高位to 1,额外的位也是如此。转换为int的是符号扩展。
char
可能有符号,也可能没有符号。
0371
将不适合
signed char
的字符。
盟友打算使用八进制。@FrançoisAndrieux:
0371
0x371
不同,
int main(){
    char c=0371;
    cout<<hex<<(int) c;
 return 0;
}