首页 文章

为什么char数据类型在为其赋值时会表现为int数据类型?

提问于
浏览
0

我知道当我们为无符号数据类型赋值时,会存储它的两个补码,即数据类型可以存储的最大值减去我们分配的负值 . 为了测试它,我编写了一个程序来说明,但是我无法理解char数据类型的行为 .

#include <iostream>
using namespace std;


template<class T>
void compare(T a,T b)
{
    cout<<dec<<"a:"<<(int)a<<"\tb:"<<(int)b<<endl; //first line
    cout<<hex<<"a:"<<(int)a<<"\tb:"<<(int)b<<endl; //second line

    if(a>b)
        cout<<"a is greater than b"<<endl;
    else
        cout<<"b is greater than a"<<endl;
}

int main()
{
    unsigned short as=2;
    unsigned short bs=-4;
    compare(as,bs);

    unsigned int al = 2;
    unsigned int bl =-4;
    compare(al,bl);

    char ac=2;
    char bc=-4;
    compare(ac,bc);

    int ai =2;
    int bi =-4;
    compare(ai,bi);
}

输出是

a:2     b:65532
a:2     b:fffc
b is greater than a
a:2     b:-4
a:2     b:fffffffc
b is greater than a
a:2     b:-4
a:2     b:fffffffc
a is greater than b
a:2     b:-4
a:2     b:fffffffc
a is greater than b

使用不同数据类型的参数调用compare(...)函数的次数

  • unsigned short- 2 bytes ,因此-4被存储为65532 .

  • unsigned int - 4 bytes ,但是因为我们试图在输出时将其强制转换为int,所以它在输出中显示为-4,因此它会欺骗编译器,但是十六进制输出和逻辑比较结果显示内部表示是两个恭维 .

  • char - 1 byte ,这是我感到困惑的地方 .

  • int - 4 bytes ,签名数据类型,没什么意外,正常结果 .

我要问的问题是为什么char表现得像一个有符号的int?即使我们在输出结果中的第一行之前将类型转换为int,为什么char显示类似于int的值,即使char是1字节和int 4字节 . unsigned short显示不同的值,因为它的内存要求是2字节 . unsigned int和int在结果的第一行显示相同的结果,因为两者都是4个字节,并且编译器被成功欺骗,并且是可接受的 . 但为什么char也显示相同的值,就好像它的内存布局与int的内存布局相同?

逻辑比较还表明char不是无符号数据类型,而是有符号数据类型 . 无符号数据类型显示b大于1 . 虽然char表示a大于b,但就signed数据类型而言 . 为什么?

不是char 1字节无符号数据类型?这是我在B.Tech学位攻读C和C课程时学到的 .

任何解释都会有所帮助 . 使用的编译器是mingw 2.19.1 .

1 回答

  • 3

    不是char 1字节无符号数据类型?

    也许,也许不是 . char 的签名是实现定义的 .

    在您当前的实现中,它显然已签名 .

    compare 方法的输出中,显示四个字节,因为您为输出转换为 int ,因此 char-4 转换为 int-4 .

相关问题