理解C中的无符号0

时间:2013-08-29 17:30:03

标签: c

我试图理解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)

请有人解释一下这是怎么回事。

3 个答案:

答案 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)