C+中有符号和无符号之间的转换+; 考虑下面的C++代码: #include <cstdio> using namespace std; int main() { int ia = -5; unsigned int uia = ia; char ca = -5; unsigned char uca = ca; printf("%d\n", (ia == uia)); printf("%d\n", (ca == uca)); return 0; }

C+中有符号和无符号之间的转换+; 考虑下面的C++代码: #include <cstdio> using namespace std; int main() { int ia = -5; unsigned int uia = ia; char ca = -5; unsigned char uca = ca; printf("%d\n", (ia == uia)); printf("%d\n", (ca == uca)); return 0; },c++,casting,C++,Casting,我不明白int和char在从signed转换为unsigned时有什么区别 你能告诉我吗?签名类型可以是负数,也可以是正数。而unsigned的值较高,但不能为负值 因此,无符号int的最大值分别为4294967296。它的最小值是0 而有符号整数的范围是-2147483648到2147483648 我希望这能帮助您理解有符号和无符号类型之间的区别 当您希望避免值为负值时,此功能会派上用场。例如数组中的引用。或者如果你只需要正的大值,而不需要负的。为了节省您的时间,您需要增加到一个较长的长度。当

我不明白
int
char
在从
signed
转换为
unsigned
时有什么区别


你能告诉我吗?

签名类型可以是负数,也可以是正数。而unsigned的值较高,但不能为负值

因此,无符号int的最大值分别为4294967296。它的最小值是0

而有符号整数的范围是-2147483648到2147483648

我希望这能帮助您理解有符号和无符号类型之间的区别


当您希望避免值为负值时,此功能会派上用场。例如数组中的引用。或者如果你只需要正的大值,而不需要负的。为了节省您的时间,您需要增加到一个较长的长度。

当从有符号转换为无符号时,它们的行为相同。不同的行为是
=
比较。它的行为与int/unsigned的预期一样,但是当比较两个较小的类型时,它们都会首先升级为
int
。因此,所发生的是-5和-5的无符号8位表示都被提升为
int
,然后进行比较。这些明显不同,无法进行比较。

好的,这种不一致行为的实际原因是char和unsigned的潜在提升。我想更具体地解释一下

首先,当与int和unsigned int变量比较时,它们的类型并不重要,因为无论它们是什么类型,它们在内存中都有相同的二进制表示,这就是==运算符所关心的

然而,当==应用于char和unsigned char变量时,它们将首先扩展到相应的32位整数类型,而它们的扩展方式是不一致的关键。由于ca是一个字符,它将通过符号位(通过MOVSX)进行扩展,而uca将仅通过填充0(通过MOVZX)进行扩展。因此,它们现在具有不重要的二进制表示

汇编代码说明了这一点

    int b1 = ia == uia;
000613E5  mov         eax,dword ptr [ia]  
000613E8  xor         ecx,ecx  
000613EA  cmp         eax,dword ptr [uia]  
000613ED  sete        cl  
000613F0  mov         dword ptr [b1],ecx  
    int b2 = ca == uca;
000613F3  movsx       eax,byte ptr [ca]  
000613F7  movzx       ecx,byte ptr [uca]  
000613FB  xor         edx,edx  
000613FD  cmp         eax,ecx  
000613FF  sete        dl  
00061402  mov         dword ptr [b2],edx 

char
是wierd。它不同于
符号字符
;char、signed char和unsigned char都是不同的。这并不能真正解决与char相关的问题。如果您还提到提升值,那就太好了。
char
的值-5的二进制表示形式是
11111 011
。而
unsigned char
的二进制表示形式是相同的(
11111 011
)但是当一个字符被转换成int时,编译器应该保持char和int的值相同。因为
char
是-5,所以
int
也应该是-5。然后一个
unsigned char
被转换成int,它的值也保持不变。
unsigned char
的值是251,所以
int
是251。这就是为什么
char
-5不等于
unsigned char
-5的原因。
    int b1 = ia == uia;
000613E5  mov         eax,dword ptr [ia]  
000613E8  xor         ecx,ecx  
000613EA  cmp         eax,dword ptr [uia]  
000613ED  sete        cl  
000613F0  mov         dword ptr [b1],ecx  
    int b2 = ca == uca;
000613F3  movsx       eax,byte ptr [ca]  
000613F7  movzx       ecx,byte ptr [uca]  
000613FB  xor         edx,edx  
000613FD  cmp         eax,ecx  
000613FF  sete        dl  
00061402  mov         dword ptr [b2],edx