如何从 strlen return 中减去一个十六进制然后添加到一个十六进制地址?

How to subtract a hex from a strlen return then add to a hex address?

我想检查一个字符串的长度然后减去0x3(十六进制);然后添加到一个存储为十六进制的地址;然后将结果作为十六进制地址放入。 地址存储在无符号长整数中。

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 return类型甚至十进制?

是不是都自动转成二进制再对二进制进行运算?

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

编辑 2:好的,因为在上下文之外命名变量地址会让人感到困惑,可以说 unsigned long int address; 是 -> unsigned long int MIKE;

首先,符号 (0x)seekNP->address 是无效的 C。您可能会想到 typecast,其中一个变量的类型转换为另一个。无论如何:

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

是正确的说法。 (假设真的有一个 seek->address 它在语法上是正确的。否则,(假设显示的结构)这个看起来更像是你的意思:

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

这里是一个简单的加法示例,减法也是如此。

请注意,当您让编译器完成工作并使用数据类型和指针时,算法会为您处理...+1 或 -1 到您的 pointer 是移动到下一项,您不必担心数据是一个字节、2 个字节还是 8 个以上字节。

看起来您正在自己完成所有工作,将地址保存在变量 unsigned long 中,您认为这是理所当然的 64 位寻址{或者如果您只是 unsigned int 那是32 位寻址,如果您有超过 2^32 字节的可寻址 space},希望您能认识到这个问题。因此,我的建议是使用指针,尤其是当您要寻址超过 1 个字节的数据时。

unsigned long *pAddress; 表示 pAddress 保存的值是一个地址,因为它被定义为一个带有 * 的指针,它指向内存中的无符号长整数类型的数据。内存中有多少字节是 unsigned long 的值,这取决于您的系统,并且是在系统级别处理的事情,而您通常不需要或应该不用担心。但在今天的计算机上,它可能是 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");

}