我想检查字符串长度,然后减去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返回类型甚至十进制?
它们是否都自动转换为二进制文件,然后在二进制文件上执行操作?
编辑:说char Operand_1 = "1000";
,我通过seek->address = strtol(seek->operand_1,NULL,16);
将其存储在unsigned long address
中 添加 strlen 返回值会正确增加十六进制变量(地址)值吗?
编辑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
都以二进制形式存储在内存中。 可视化表示(即是否格式化将其值显示为decimal
,hexadecimal
或octal
对内存中的值存储没有影响。因此,C 语句可以在其语句中混合和匹配各种形式的整数,而不必担心内存中的结果值会受到影响。
int sum = 103 + 1003 + 10003;
int sum = 0x67 + 0x3eb + 0x2713
两者都会导致11109
或0x2B65
这里有一个简单的加法示例,减法的工作方式相同。
请注意,当您让编译器完成工作并使用数据类型和指针时,算术会为您处理... 指向指针的 +1 或 -1 是移动到下一项,您不必担心数据是在一个字节、2 个字节还是 8+ 个字节中。
看起来您正在自己做所有工作,将地址保留在unsigned long
变量中,您理所当然地认为它是 64 位寻址 {或者如果您只是unsigned int
那是 32 位寻址,希望您认识到问题,如果您有超过 2^32 字节的可寻址空间}。 所以我的建议是使用指针,特别是当你要处理超过1字节的数据时。
unsigned long *pAddress;
表示 pAddress 保存一个地址值,因为它被定义为带有*
的指针,并且它指向内存中无符号长整数类型的数据。 内存中的字节数是一个无符号的值,取决于你的系统,它是在系统级别处理的事情,你通常不必或应该担心。 但在今天的计算机上,它可能是 64 位或长 int。
我认为一旦你理解了它是如何工作的,它就会变得很容易:
#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 %pn", pa );
printf(" address of b is %pn", pb );
printf(" address of c is %pn", pc );
printf(" address of d is %pn", pd );
printf(" address of e is %pn", pe );
printf(" address of f is %pn", pf );
printf("n");
printf(" address of a+1 is %pn", pa+1 );
printf(" address of b+1 is %pn", pb+1 );
printf(" address of c+1 is %pn", pc+1 );
printf(" address of d+1 is %pn", pd+1 );
printf(" address of e+1 is %pn", pe+1 );
printf(" address of f+1 is %pn", pf+1 );
printf("n");
printf(" sizeof( char ) is %ldn", sizeof( char ) );
printf(" sizeof( short int ) is %ldn", sizeof( short int ) );
printf(" sizeof( int) is %ldn", sizeof( int ) );
printf(" sizeof( long int ) is %ldn", sizeof( long int ) );
printf(" sizeof( float ) is %ldn", sizeof( float ) );
printf(" sizeof( double ) is %ldn", sizeof( double ) );
printf("n");
}