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