当我们给char数据类型赋值为负值时,它为什么表现得像int数据类型
Why does char datatype behave like int datatype when we assign negative value to it?
我知道,当我们给一个无符号数据类型分配一个负值时,就会存储它的两个互补值,即该数据类型可以存储的最大值减去我们分配的负值。为了测试这一点,我编写了一个程序来说明这一点。然而,我无法理解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(…)函数使用不同数据类型的参数调用多次
- 无符号短-2字节,因此-4存储为65532
- unsigned int-4 bytes,然而,当我们试图在输出时将其类型转换为int时,它在输出中显示为-4,因此这对编译器来说是一个难题,然而十六进制输出和逻辑比较结果显示内部表示是二的互补
- char-1字节,这就是我感到困惑的地方
- 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
。
相关文章:
- 为什么双精度数据类型在C++中出错?
- uint32, int16, uint8 .为什么这些常用的数据类型没有进入标准
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- 为什么指定数据类型而不是构造功能参数?C
- 为什么我的气泡排序不适用于双精度数据类型?
- 为什么即使从未使用了数据类型,为什么还不够
- 为什么C CHAR数据类型3D数组通过参数第一个括号为空白
- 为什么 std::bitset 只支持整型数据类型?为什么不支持浮点数?
- 为什么没有int或false的数据类型
- 为什么我们必须在箭头符号(->)之后再次指定数据类型
- 为什么在所有数据类型中,int 取决于操作系统或编译器
- 为什么向量的数据类型在C++的尖括号内声明
- C++ 个字符数据类型的用途是什么?为什么不直接使用字符串?
- 为什么没有最小尺寸的布尔数据类型
- 为什么我的链接数据类型复制构造函数不起作用?
- 当我们给char数据类型赋值为负值时,它为什么表现得像int数据类型
- 为什么数据类型转换错误只出现在C++中而不出现在C中
- 为什么数据类型的大小会随着操作系统的变化而变化
- 为什么计算时会发生溢出取决于数据类型,而赋值的类型可以容纳它
- 为什么Java和C++中的数据类型大小不同