C';s比较';等级晋升有什么问题吗 #包括 int main() { 无符号整数x=1; chary=-1; 如果(x>y) { printf(“x>y”); } else如果(x==y) printf(“x=y”); 其他的 printf(“x

C';s比较';等级晋升有什么问题吗 #包括 int main() { 无符号整数x=1; chary=-1; 如果(x>y) { printf(“x>y”); } else如果(x==y) printf(“x=y”); 其他的 printf(“x,c,C,只需运行以下命令: #include <stdio.h> int main() { unsigned int x=1; char y=-1; if (x>y) { printf("x>y"); } else if(x==y) printf("x=y"); else printf("x<y"); return 0; } 它将输出变量的十六进制值: int

只需运行以下命令:

#include <stdio.h>

int main()
{
    unsigned int x=1;
    char y=-1;
    if (x>y)
    {
        printf("x>y");
    }
    else if(x==y)
        printf("x=y");
    else
        printf("x<y");
    return 0;
}
它将输出变量的十六进制值:

int main()
{
    unsigned int x=1;
    char y=-1;
    printf("x : %#010x\n", x);
    printf("y : %#010x\n", y);
    return 0;
}
我是否需要进一步…?

只需运行以下命令:

#include <stdio.h>

int main()
{
    unsigned int x=1;
    char y=-1;
    if (x>y)
    {
        printf("x>y");
    }
    else if(x==y)
        printf("x=y");
    else
        printf("x<y");
    return 0;
}
它将输出变量的十六进制值:

int main()
{
    unsigned int x=1;
    char y=-1;
    printf("x : %#010x\n", x);
    printf("y : %#010x\n", y);
    return 0;
}

我还需要继续吗…?

这叫做
类型促销

规则(也可在K&R2第44页或更新的ANSI/ISO C标准第6.2.1节中找到)大致如下:

首先,在大多数情况下,
char
short int
类型的值会立即转换为
int

2,如果一个操作涉及两个操作数,其中一个操作数的类型为
long double
,则另一个操作数将转换为
long double

3,如果一个操作涉及两个操作数,其中一个操作数的类型为
double
,则另一个操作数将转换为
double

4,如果一个操作涉及两个操作数,其中一个操作数的类型为
float
,则另一个操作数转换为
float

5,如果一个操作涉及两个操作数,其中一个操作数的类型为
long int
,则另一个操作数将转换为
long int

6,如果一个运算同时涉及有符号整数和无符号整数,情况就要复杂一些。如果无符号操作数较小(可能我们是在
无符号整数
长整数
),使较大的有符号类型可以表示较小的无符号类型的所有值,然后将无符号值转换为较大的有符号类型,结果为较大的有符号类型。否则(即,如果有符号类型不能表示无符号类型的所有值),这两个值都转换为公共无符号类型,结果为该无符号类型


7,最后,当使用赋值运算符将值赋值给变量时,如果(a)值和变量都具有算术类型(即整数或浮点),或(b),则该值将自动转换为变量类型值和变量都是指针,其中一个或另一个类型为
void*

这称为
类型提升

规则(也可在K&R2第44页或更新的ANSI/ISO C标准第6.2.1节中找到)大致如下:

首先,在大多数情况下,
char
short int
类型的值会立即转换为
int

2,如果一个操作涉及两个操作数,其中一个操作数的类型为
long double
,则另一个操作数将转换为
long double

3,如果一个操作涉及两个操作数,其中一个操作数的类型为
double
,则另一个操作数将转换为
double

4,如果一个操作涉及两个操作数,其中一个操作数的类型为
float
,则另一个操作数转换为
float

5,如果一个操作涉及两个操作数,其中一个操作数的类型为
long int
,则另一个操作数将转换为
long int

6,如果一个运算同时涉及有符号整数和无符号整数,情况就要复杂一些。如果无符号操作数较小(可能我们是在
无符号整数
长整数
),使较大的有符号类型可以表示较小的无符号类型的所有值,然后将无符号值转换为较大的有符号类型,结果为较大的有符号类型。否则(即,如果有符号类型不能表示无符号类型的所有值),这两个值都转换为公共无符号类型,结果为该无符号类型


7,最后,当使用赋值运算符将值赋值给变量时,如果(a)值和变量都具有算术类型(即整数或浮点),或(b),则该值将自动转换为变量类型值和变量都是指针,其中一个类型为
void*

问题是比较有符号类型和无符号类型。 有符号变量(如
char y
)通常使用一位符号和2位负数补码来存储。 因此,
char y=-1;
为您提供了一个y,其一般表示形式为:

x : 0x00000001
y : 0xffffffff

如果(二进制1>二进制11111111)

问题是比较有符号类型和无符号类型。 有符号变量(如
char y
)通常使用一位符号和2位负数补码来存储。 因此,
char y=-1;
为您提供了一个y,其一般表示形式为:

x : 0x00000001
y : 0xffffffff

这意味着,如果(二进制1>二进制11111111)

根据标准,您的比较是正确的

首先,实现定义了
char
signed
还是
unsigned

如果
char
unsigned
,则初始化将使用模运算,因此初始化为
-1
将初始化为
unsigned char
的最大值,该值保证大于1。比较将该
char
转换为
unsigned
(不改变值)在进行比较之前

如果
char
signed
,比较将把值
-1
char
转换为类型
unsigned
(因为x是类型
unsigned
)。该转换再次使用模运算,除了
unsigned
类型(因此
-1
将转换为
0000 0001 
1111 1110 
+       1 
1111 1111
0000 0000 0000 0001 
1111 1111 1111 1110 
+                 1 
1111 1111 1111 1111
int main(){
    int y = -1;
    cout << y << endl;             //if x is an int: x > y
    cout << unsigned(y) << endl;   //if x is an unsigned int y is now treated as UINT_MAX: x < y 
    return 0;
}
-1
4294967295