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

时间:2012-10-14 20:43:30

标签: c++

我知道当我们为无符号数据类型赋值时,会存储它的两个补码,即数据类型可以存储的最大值减去我们分配的负值。 为了测试它,我编写了一个程序来说明,但是我无法理解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(...)函数
  1. 无符号短2字节,因此-4存储为65532。
  2. unsigned int - 4个字节,但是因为我们在输出它时试图将它强制转换为int,所以它在输出中显示为-4,因此它会欺骗编译器,但十六进制输出和逻辑比较结果表明内部表示是两个人的赞美。
  3. 字符 - 1字节,这就是我感到困惑的地方
  4. int - 4个字节,签名数据类型,没有任何意外,正常结果。
  5. 我要问的问题是为什么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 个答案:

答案 0 :(得分:3)

  

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

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

在您当前的实施中,它显然已签名。

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