我试图理解C中的数字表示。 我正在开发一个类似下面的代码段。
#include <stdio.h>
#include <string.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len)
{
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_unsigned(short x) {
show_bytes((byte_pointer) &x, sizeof(unsigned));
}
int main(int argc,char*argv[])
{
int length=0;
unsigned g=(unsigned)length;// i aslo tried with unsigned g=0 and the bytes are the same
show_unsigned(g);
show_int(length);
printf("%d",g);//this prints 0
return 0;
}
这里,show_unsigned()
和show_int()
打印指定为arguments的变量的字节表示。对于int length,字节表示按预期为全零,但对于无符号g,字节表示为{{ 1}}。但是当我用%d打印g时,我得到0(所以我想数值被解释为0)
请有人解释一下这是怎么回事。
答案 0 :(得分:10)
在:
void show_unsigned(short x) {
show_bytes((byte_pointer) &x, sizeof(unsigned));
}
您宣布参数short x
小于int x
,因此您忽略了某些00
,并且您的打印功能正在显示相邻的垃圾。
答案 1 :(得分:1)
您正在做的事情没有任何意义,尤其是您所发生的类型转换。其他人已经指出了关于转换为简短
的观点尝试这样做
而不是编写荒谬的函数void show_bytes( void *start, unsigned int len ) {
unsigned char* ptr = (unsigned char *) start;
unsigned int i = 0;
for ( i = 0; i < len; ++i, ++ptr ) {
printf( " %.2x", ptr[0] );
}
}
而不是像你一样打电话就像是:
show_bytes( (void *)&x, sizeof(x));
如果那太多的打字就会产生一个宏。现在它适用于你提出的任何类型。
答案 2 :(得分:1)
您正在sizeof(unsigned)
中阅读short
个字节。 short
不能保证与unsigned
的大小相同,因此,当读取短片旁边的字节时,会读取垃圾数据。
要解决此问题,请将参数作为unsigned
传递,或者在使用sizeof时,使用sizeof(short)
。