如何从strlen返回中减去十六进制然后添加到十六进制地址?

问题描述 投票:0回答:2

我想检查字符串长度然后减去0x3(十六进制);然后添加到存储为十六进制的地址;然后将结果放在十六进制的地址中。 address存储在unsigned long int中。

struct node { unsigned long int address;  char operand_1[12];};

这样做是这样的:

(0x)seekNP->address = (0x)seek->address +(( (0x)strlen(seek->operand_1)) - 0x3);

或者像那样:

seekNP->address = seek->address +((strlen(seek->operand_1)) - 0xF);

我知道所有数字最后都存储在二进制文件中,也许我的问题也应该是当我在十六进制和十进制size_t返回类型甚至十进制之间执行算术时会发生什么?

他们都自动转换为二进制,然后在二进制上执行操作?

编辑:说char Operand_1 = "1000";和我通过unsigned long address存储在seek->address = strtol(seek->operand_1,NULL,16);将正确添加strlen返回值增量十六进制变量(地址)值?

编辑2:好吧,因为它混淆命名一个变量地址脱离上下文让我们说unsigned long int address;是 - > unsigned long int MIKE;

c hex decimal strlen
2个回答
1
投票

首先,符号(0x)seekNP->address无效C.你可能会想到一个typecast,其中一个变量的类型被转换为另一个变量。在任何情况下:

seekNP->address = seek->address +((strlen(seek->operand_1)) - 0xF);

是正确的声明。 (假设确实有一个seek->addressit在语法上是正确的。否则,(假设结构显示)这个似乎更可能是你的意思:

struct  { 
    unsigned long int address;  
    char operand_1[12];
}seekNP;
....    

//  interger    =         integer         - integer    
seekNP->address = strlen(seekNP->operand_1) - 0xF; //seems more correct given 
                                                 //the variable you are showing.  

为了澄清,正如评论中提到的,所有形式的int都以二进制形式存储在内存中。视觉表示(即它的格式是否表示它的值为decimalhexadecimaloctal对内存中的值存储没有区别。因此,C语句可以在其语句中混合和匹配各种形式的整数,而不用担心内存中的结果值将会被影响 。

int sum = 103 + 1003 + 10003;
int sum = 0x67 + 0x3eb + 0x2713

两者都导致111090x2B65


0
投票

这是一个添加的简单示例,减法将以相同的方式工作。

注意当你使编译器完成工作并使用数据类型和指针时,算术会照顾你...指针的+1或-1是移动到下一个项目你不必担心你的数据是一个字节,或2个字节,或8个字节。

看起来你正在做所有的工作你自己在一个unsigned long变量中保存一个地址,你认为这是64位寻址{或者如果你只是unsigned int这是32位寻址,并希望你认识到这个问题如果你有超过2 ^ 32字节的可寻址空间}。所以我的建议是使用指针,特别是如果你要处理的数据超过1个字节。

unsigned long *pAddress;表示pAddress保存一个地址值,因为它被定义为带有*的指针,并且它指向内存中具有无符号长整数类型的数据。内存中的多少字节是一个长期无符号的值,它取决于您的系统,并且是系统级别需要注意的事情,以及您通常不必或不必担心的事情。但在今天的计算机上它可能是64位或长整数。

我想,一旦你理解了它是如何工作的,它就会变得容易:

#include <stdio.h>

int main ( int argc, char *argv[] )
{
   char a[8];
   short int b[8];
   int c[8];
   long int d[8];
   float e[8];
   double f[8];

   char *pa;
   short int *pb;
   int *pc;
   long int *pd;
   float *pe;
   double *pf;

   pa = a;
   pb = b;
   pc = c;
   pd = d;
   pe = e;
   pf = f;

   printf(" address of a is   %p\n", pa );
   printf(" address of b is   %p\n", pb );
   printf(" address of c is   %p\n", pc );
   printf(" address of d is   %p\n", pd );
   printf(" address of e is   %p\n", pe );
   printf(" address of f is   %p\n", pf );
   printf("\n");
   printf(" address of a+1 is %p\n", pa+1 );
   printf(" address of b+1 is %p\n", pb+1 );
   printf(" address of c+1 is %p\n", pc+1 );
   printf(" address of d+1 is %p\n", pd+1 );
   printf(" address of e+1 is %p\n", pe+1 );
   printf(" address of f+1 is %p\n", pf+1 );
   printf("\n");
   printf(" sizeof( char )      is %ld\n", sizeof( char ) );
   printf(" sizeof( short int ) is %ld\n", sizeof( short int ) );
   printf(" sizeof( int)        is %ld\n", sizeof( int ) );
   printf(" sizeof( long int )  is %ld\n", sizeof( long int ) );
   printf(" sizeof( float )     is %ld\n", sizeof( float ) );
   printf(" sizeof( double )    is %ld\n", sizeof( double ) );

   printf("\n");

}

© www.soinside.com 2019 - 2024. All rights reserved.