我想知道我是否可以使用 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);
}
Run Code Online (Sandbox Code Playgroud)
该函数int char_to_bin(char* d)将指向的字符值转换为二进制数,我对它所做的所有测试都表明它有效。但是,当我用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;
}
Run Code Online (Sandbox Code Playgroud)
检查给定内存地址中包含的值......据我所知,int变量类型占用4个字节的内存,字节内容的总和是值或变量......但我得到了结果总和与变量值完全不同。
有什么办法可以解决这个问题,还是我应该放弃并尝试将传递的 int 转换int_to_bin(int* p)为 char 并将其传递给char_to_bin(char* p)函数?
据我所知,int变量类型占用4个字节的内存,字节内容的总和就是值或者变量...
嗯,int是sizeof(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
Run Code Online (Sandbox Code Playgroud)
或者
(c[3] << 24) | (c[2] << 16) | (c[1] << 8) | (c[0] << 0); // little endian
Run Code Online (Sandbox Code Playgroud)
哪里unsigned char *c = (unsigned char*)(&unsigned_int_variable);。
请注意,即使char*指针是例外(请参阅注释),但通常将不同类型的指针设置为指向值会破坏所谓的“严格别名规则”,您应该在执行此类操作之前阅读该规则。