-1

我正在尝试理解 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()打印指定为参数的变量的字节表示。对于 int 长度,字节表示按预期全为零,但对于无符号 g,字节表示是00 00 04 08。但是当我用 %d 打印 g 时,我得到 0(所以我想数值被解释为 0 )

请有人解释这是如何发生的。

4

3 回答 3

10

在:

void show_unsigned(short x) {
    show_bytes((byte_pointer) &x, sizeof(unsigned));
}

您声明了short x小于的参数,int x因此您忽略了一些,00并且您的打印功能正在显示相邻的垃圾。

于 2013-08-29T17:33:59.793 回答
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));

如果那是太多的打字,那就做一个宏。现在它适用于您想出的任何类型。

于 2013-08-29T17:38:34.007 回答
1

您正在sizeof(unsigned)读取short. short不保证与 的大小相同unsigned,因此,在读取短字节旁边的字节时,会读取垃圾数据。

要解决此问题,请将您的参数作为 传递unsigned,或者在使用 sizeof 时使用sizeof(short).

于 2013-08-29T17:39:07.997 回答