我想检查字符串长度然后减去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;
首先,符号(0x)seekNP->address
无效C.你可能会想到一个typecast
,其中一个变量的类型被转换为另一个变量。在任何情况下:
seekNP->address = seek->address +((strlen(seek->operand_1)) - 0xF);
是正确的声明。 (假设确实有一个seek->address
it在语法上是正确的。否则,(假设结构显示)这个似乎更可能是你的意思:
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位或长整数。
我想,一旦你理解了它是如何工作的,它就会变得容易:
#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");
}