我try 执行以下程序:

#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!!!

为什么我们得到的结果都不一样

char是一样的!!!

codepad link美元.

推荐答案

这是因为C中有各种隐式类型转换规则.C程序员必须知道其中两个规则:100integer promotions(后者是前者的一部分).

在char情况下,您有类型(signed char) == (unsigned char).这两个都是small integer types.其他这样的小整数类型是boolshort.integer promotion rules规定,每当小整数类型是运算的操作数时,其类型将被提升为int,这是有符号的.无论类型是有符号的还是无符号的,都会发生这种情况.

signed char的情况下,符号将被保留,并将提升为包含值-5的int.对于unsigned char,它包含一个251(0xFB)的值.它将升级为包含相同值的int.你最终会

if( (int)-5 == (int)251 )

在整数情况下,您有类型(signed int) == (unsigned int).它们不是小整数类型,因此整数提升不适用.取而代之的是,它们被the usual arithmetic conversions平衡,这表明如果两个操作数具有相同的"秩"(大小)但符号不同,则有符号操作数被转换为与无符号操作数相同的类型.你最终会得到

if( (unsigned int)-5 == (unsigned int)-5)

C++相关问答推荐

C:gcc返回多个错误定义,但msvc—不""'

Win32API Wizzard97 PropSheet_SetWizButton不工作

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

如何将字符**传递给需要常量字符指针的常量数组的函数

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

Vcpkg的配置文件

我的C函数起作用了,但我不确定为什么

将数组插入数组

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

合并对 struct 数组进行排序

为什么Linux无法映射这个PT_LOAD ELF段?

静态初始化顺序失败是否适用于C语言?

变量值不正确的问题

分配给静态变量和动态变量的位置之间有区别吗?

如果类型是新的,offsetof是否与typeof一起工作?

共享内存未授予父进程权限

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

为什么实现文件中的自由函数默认没有内部链接?

仅使用其内存地址取消引用 C 中的 struct