当我们给char数据类型赋值为负值时,它为什么表现得像int数据类型

Why does char datatype behave like int datatype when we assign negative value to it?

本文关键字:数据类型 为什么 int char 我们 赋值      更新时间:2023-10-16

我知道,当我们给一个无符号数据类型分配一个负值时,就会存储它的两个互补值,即该数据类型可以存储的最大值减去我们分配的负值。为了测试这一点,我编写了一个程序来说明这一点。然而,我无法理解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 bytes,然而,当我们试图在输出时将其类型转换为int时,它在输出中显示为-4,因此这对编译器来说是一个难题,然而十六进制输出和逻辑比较结果显示内部表示是二的互补
  3. char-1字节,这就是我感到困惑的地方
  4. int-4字节,带符号的数据类型,没有意外,结果正常

我要问的问题是,为什么char的行为像一个有符号的int?尽管我们在输出结果的第一行之前对int进行了类型转换,但为什么char显示的值与int相似,即使char是1字节,int是4字节。无符号short显示不同的值,因为它的内存需求是2字节。unsigned int和int在结果的第一行显示相同的结果,因为两者都是4个字节,编译器成功地被欺骗了,这是可以接受的。但为什么char也显示相同的值,就好像它的内存布局和int的一样?

逻辑比较还表明,char的行为不是无符号数据类型,而是有符号数据类型。无符号数据类型显示b大于1。当char显示a大于b时,就带符号的数据类型而言。为什么?

char不是1字节无符号数据类型吗?这是我在理工学士学位学习C和C++课程时学到的。

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

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

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

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

compare方法的输出中,显示了四个字节,因为输出强制转换为int,所以char-4转换为int-4