类型转换 - unsigned to signed int / char

类型转换 - unsigned to signed int / char

我试过执行以下程序:

#include <stdio.h>int main() {
    signed char a = -5;
    unsigned char b = -5;
    int c = -5;
    unsigned int d = -5;

    if (a == b)
        printf("\r\n char is SAME!!!");
    else
        printf("\r\n char is DIFF!!!");

    if (c == d)
        printf("\r\n int is SAME!!!");
    else
        printf("\r\n int is DIFF!!!");

    return 0;}

对于这个程序,我得到输出:

char是DIFF !!! int是相同的!

为什么我们两者都有不同的输出?
输出应该如下?

char是相同的!int是相同的!

一个键盘连接


繁星点点滴滴
浏览 1055回答 3
3回答

largeQ

这是因为C中的各种隐式类型转换规则.C程序员必须知道其中有两个:通常的算术转换和整数提升(后者是前者的一部分)。在char情况下,你有类型(signed char) == (unsigned char)。这些都是小整数类型。其他这样的小整数类型是bool和short。该整数提升规则指出,当一个小的整数类型是操作的操作数,它的类型将得到提升到int,这是签署。无论类型是签名还是未签名,都会发生这种情况。在这种情况下signed char,符号将被保留,并将被提升为int包含值-5&nbsp;的符号。在它的情况下unsigned char,它包含一个值251(0xFB)。它将被提升为int包含相同值的。你结束了if(&nbsp;(int)-5&nbsp;==&nbsp;(int)251&nbsp;)在整数的情况下,您有类型(signed int) == (unsigned int)。它们不是小整数类型,因此整数促销不适用。相反,它们通常通过算术转换进行平衡,该转换声明如果两个操作数具有相同的“等级”(大小)但签名不同,则签名操作数将转换为与无符号操作数相同的类型。你结束了if(&nbsp;(unsigned&nbsp;int)-5&nbsp;==&nbsp;(unsigned&nbsp;int)-5)

侃侃无极

好问题!该int比较有效,因为这两个整数包含完全相同的位,所以他们基本上是相同的。但那是什么char?啊,C&nbsp;在各种场合暗中提升chars&nbsp;int。这是其中之一。你的代码说if(a==b),但编译器实际上转向的是:if((int)a==(int)b)(int)a是-5,但是(int)b是251.这些肯定是不一样的。编辑:正如@ Carbonic-Acid指出的那样,(int)b只有当a&nbsp;char为8位长时才是251&nbsp;。如果int是32位长,(int)b则为-32764。REDIT:如果一个字节长度不是8位,那么就会有很多评论讨论答案的本质。在这种情况下唯一的区别是,(int)b不是251而是一个不同的正数,而不是-5。这与仍然非常酷的问题无关。
打开App,查看更多内容
随时随地看视频慕课网APP