gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:53:14 27 4
gpt4 key购买 nike

我知道,当我们为无符号数据类型分配一个负值时,就会存储它的补码,即该数据类型可以存储的最大值减去我们分配的负值。为了测试这一点,我编写了一个程序来说明这一点,但是我无法理解 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. unsigned short- 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 个字节。 unsigned short 显示不同的值,因为它的内存要求是 2 个字节。unsigned int 和 int 在结果的第一行显示相同的结果,因为它们都是 4 个字节,并且编译器被成功欺骗,并且是可以接受的。但是为什么char也显示相同的值,好像它的内存布局和int一样?

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

char 不是 1 字节无符号数据类型吗?这是我在获得 B.Tech 学位的 C 和 C++ 类(class)时学到的东西。

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

最佳答案

Isn't char 1 byte unsigned datatype?

也许,也许不是。 char 的符号是实现定义的。

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

compare 方法的输出中,您会看到四个字节,因为您将输出转换为 int,所以 char-4 被转换为 int-4

关于c++ - 当我们为它赋负值时,为什么 char 数据类型表现得像 int 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com