当前位置: 首页 > 知识库问答 >
问题:

为什么当我们给char数据类型赋值负值时,它的行为类似于int数据类型?

苏宏逸
2023-03-14

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

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

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

char 1 byte不是无符号数据类型吗?这是我在读B.Tech学位的C和C语言课程时学到的。

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

共有1个答案

祁和通
2023-03-14

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

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

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

比较方法的输出中,您会得到显示的四个字节,因为您将输出强制转换为int,因此charvalue-4被转换为intvalue-4

 类似资料:
  • 问题内容: 具体来说,在关系数据库管理系统中,为什么我们在创建时需要知道列的数据类型(更可能是对象的属性)? 对我来说,数据类型感觉就像是一种优化,因为可以以多种方式实现一个数据点。将语义角色和约束分配给数据点,然后让引擎在内部检查和优化哪种数据类型最能为用户服务会更好吗? 我怀疑这是繁重的工作,为什么只问用户而不是做工作就更容易了。 你怎么认为?我们要去哪里?这是现实的期望吗?还是我有一个错误的

  • 问题内容: 我似乎找不到有关Redis命令的有用信息。我想知道给定键值的数据类型。例如,要列出数据库的所有键,我运行以下命令: 在我的设置中,得到以下结果: 我如何知道密钥包含的数据类型?我尝试运行,但出现错误 有什么想法吗? 问题答案: 您可以使用type命令:http : //redis.io/commands/type

  • 所以,实际上我对Java编程语言还是新手,并且还在学习如何转换数据类型,所以在这种情况下,我很难将字节转换为短字节。你们能帮帮我吗?? 所以在这种情况下,我可以正常地从(int)转换为(long)数据类型,因为(long)数据大小大于(int)。这与我尝试将其从(short)转换为(int)时的情况相同。但为什么我不能使用这个概念将数据类型从(byte)转换为(short)??即使(短)数据大小大

  • 问题内容: 我在代码隐藏中收到转换失败的错误。我的代码如下: 我收到以下错误: 将nvarchar值转换为数据类型int时,转换失败。 在这里必须进行哪些更改? 问题答案: 我想这是一个整数,但您正在分配一个字符串。因此,这可能会解决它: 编辑:由于您已评论该会话存储了用户名,但该列是一个int列,因此您有三个选择: 更改会话以存储用户标识而不是名称 更改列以存储用户名 从存储用户名的表中选择用户

  • 问题内容: 我创建了一个过程并收到了此消息 将varchar值’%’转换为数据类型int时,转换失败。 我不知道这可能是什么,但是当我将过程更改为这样时: 似乎工作正常。我是SQL的新手,所以可以得到任何帮助,也许有更好的方法来做我想做的事情? 问题答案: 这是在子句中: 是一个整数。因此,您需要将其转换为字符串: 为什么要使用称为的列是可疑的。也许您只想要:

  • 我是angular的新手,我在学习这个hero教程时,偶然发现了这个错误: 我在这里复制了错误。