gpt4 book ai didi

我可以通过 char* 指针访问 int 变量的每个字节吗?

转载 作者:行者123 更新时间:2023-12-02 21:26:17 24 4
gpt4 key购买 nike

我想知道是否可以使用 char* 值来访问 int 值的每个字节...所以我尝试使用指针值来访问 int 的第一个字节,并使用 for 循环来访问另一个字节int 字节...
代码如下:

int char_to_bin(char* d){
int p= (int)*d;
int i=0,number=0;
if (p>=0){
do{

number+= (p%2)*(pow(10,i));
i++;
p= p/2;
}while (p>0);
}
else{
p=p *(-1);
do{

number+= (p%2)*pow(10,i);
i++;
p=p/2;
}while (p>0);
number*=-1;
}

return number;
}

long int int_to_bin(int* p){
long int j=1,number=0,number1=0,number2=0,digits;
char* c=&p;
number=char_to_bin(c);
for (j;j<(sizeof(int)/sizeof(char));j++){
number1=char_to_bin(c+j);
digits=floor(log10(abs(number1))) + 1;
number2=number1*pow(10,digits);
number=number1+number2;
}
return number;
}


int main(){

char k= 100;
char* j= &k;
int inte=100;
int *h;
h= &inte;
int c= char_to_bin(j);
printf("%d\n",c);
long int d= int_to_bin(h);
printf("%ld\n",d);
}

函数int char_to_bin(char* d)将指向的 char 值转换为二进制数,我对其所做的所有测试都表明它有效。但当我使用int char_to_bin(char* d)时在int_to_bin(int* p)出了问题。
基本上,int_to_bin(int* p)应该将指向的 int 的第一个字节转换为二进制,然后将以下字节(因为 char* 指向一个字节)转换为十进制,将字节乘以 10^(位数),这样我可能会得到一个数字例如“000000001100100”,但出了问题,函数的结果与二进制有很大不同,另外,我尝试输入 printf("%d \n",number1)int_to_bin(int* p)函数,像这样:

long int int_to_bin(int* p){
long int j=1,number=0,number1=0,number2=0,digits;
char* c=&p;
number=char_to_bin(c);
for (j;j<(sizeof(int)/sizeof(char));j++){
number1=char_to_bin(c+j);
printf("%d \n",number1); //---------------here------------------
digits=floor(log10(abs(number1))) + 1;
number2=number1*pow(10,digits);
number=number1+number2;
}
return number;
}

检查给定内存地址中包含的值...据我所知,int变量类型占用4个字节的内存,字节内容的总和就是值或变量...但是我得到的结果与变量值完全不同。
有什么办法可以解决这个问题,或者我应该放弃并尝试转换传递的 int int_to_bin(int* p)转换为 char 并将其传递给 char_to_bin(char* p)功能?

最佳答案

As far as I know, int variable types occupy 4 bytes of memory, and the sum of the content of the bytes is the value or the variable...

嗯,intsizeof(int) 字节,在现代 PC 操作系统(64 位和 32 位)上通常为 4 ,但它可以是任何东西,只要 sizeof(short) <= sizeof(int) <= sizeof(long) 即可。因此,请始终使用 sizeof 而不是硬编码值。

但是值不是内容的总和...这将非常浪费,不同顺序的相同字节将给出相同的int。值是,取决于字节顺序,并假设无符号数字:

(c[0] << 24) | (c[1] << 16) | (c[2] << 8) | (c[3] << 0); // big endian

(c[3] << 24) | (c[2] << 16) | (c[1] << 8) | (c[0] << 0); // little endian

其中unsigned char *c = (unsigned char*)(&unsigned_int_variable);


请注意,即使 char* 指针是异常(exception)(请参阅注释),但通常设置不同类型的指针指向值会中断所谓的 "strict aliasing rules" ,在做这种事情之前你应该阅读它。

关于我可以通过 char* 指针访问 int 变量的每个字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com