为什么“long-datatype数组有十六进制值?

时间:2015-03-19 17:59:25

标签: c type-conversion

我尝试使用Tiny Encryption Algorithm,但事情就是这样: 我没有理解为什么数组是long类型并且它具有十六进制值,例如,

unsigned long v[] = {0xe15034c8, 0x260fd6d5};

另外,我想从流中传递明文(ASCII)读取,我应该以什么数据格式将其传递给这种类型的数组?

加密功能是:

void encipher(unsigned long *const v,unsigned long *const w,
              const unsigned long *const k)
{
    register unsigned long       y=v[0],z=v[1],sum=0,delta=0x9E3779B9,
                a=k[0],b=k[1],c=k[2],d=k[3],n=32;

    while(n-->0)
    {
        sum += delta;
        y += (z << 4)+a ^ z+sum ^ (z >> 5)+b;
        z += (y << 4)+c ^ y+sum ^ (y >> 5)+d;
    }

    w[0]=y; w[1]=z;
}

4 个答案:

答案 0 :(得分:1)

它有long因为 0xe15034c8 在base-10中是3780129992。在某些平台上,int太小而无法处理这么大的数字。此外,十六进制表示通常具有较少的数字并且在代码中比十进制表示消耗更少的空间。 Here表示int32的最大值为2,147,483,647。您的第一个号码(3,780,129,992)更大,而第二个号码(638,572,245)更小。

答案 1 :(得分:1)

大多数平台上的

unsigned long将大于4个字节。 所以你在这个数组中存储一个32位的值,这完全没问题。

您可以执行sizeof(unsigned long)并查看无符号长整数的大小,并计算它可以容纳的最大值。

  

另外,我想从流中传递明文(ASCII)读取   我应该将数据格式传递给这种类型的数组吗?

假设您想要将输入作为字符串读取并将值存储在此数组中,那么可以使用像atoi()这样的API

答案 2 :(得分:1)

积分常数可以用八进制,十进制或十六进制表示。以下行是等效的,并将a初始化为10

int a = 012;
int a = 10;
int a = 0xA;

在你的情况下,

unsigned long v[] = {0xe15034c8, 0x260fd6d5};

相当于:

unsigned long v[] = {3780129992, 638572245};

关于

  

我想从流中传递明文(ASCII)读取,我应该以什么数据格式将其传递给这种类型的数组?

您需要使用标准库中的一些函数解析字符串的内容,例如sscanfatoistrtol,并分配结果编号为v的元素。

答案 3 :(得分:0)

这是一种常见的混淆。十六进制不是数据类型,它是一种表示。例如,可以在其他口语(即西班牙语中的“mesa”)上不同地调用“表”,但它仍然是表。在这种情况下,值(例如10)可以用不同的方式表示,对我们来说最常见的是基数10.但是计算机使用二进制(以及其他相关的表示,如十六进制),因此对我们来说10是什么,对于计算机它是1010(十六进制)。最后,long只是一个32位值,您想要表示它的方式取决于您,但值是相同的。

对于字符,对于计算机,它们仍然是数字,因此您可以将它们的值作为长片的块传递(即使用atoi()