我知道当我们为无符号数据类型赋值时,会存储它的两个补码,即数据类型可以存储的最大值减去我们分配的负值 . 为了测试它,我编写了一个程序来说明,但是我无法理解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 回答
也许,也许不是 .
char
的签名是实现定义的 .在您当前的实现中,它显然已签名 .
在
compare
方法的输出中,显示四个字节,因为您为输出转换为int
,因此char
值-4
转换为int
值-4
.