Arrays 数组中的值即使在c中更改后也将打印为0

Arrays 数组中的值即使在c中更改后也将打印为0,arrays,c,Arrays,C,因此,我使用typedef unsigned char byte创建了一个自定义类型,然后声明它的数组,就像使用byte mem[255]。我使用了mem[0]=0x10100000初始化第一个值,但当我使用printf(“%d”,mem[0])打印它时我得到0。为什么?您给它分配了十六进制数0x10100000,它远远大于一个字符,因此不能存储在字节中。如果您想使用二进制数,并且您的编译器支持此功能,您可以尝试改用0b10100000。您不能在8位变量(mem[0])中放入32位值。你可能是有

因此,我使用
typedef unsigned char byte创建了一个自定义类型
,然后声明它的数组,就像使用
byte mem[255]。我使用了
mem[0]=0x10100000
初始化第一个值,但当我使用
printf(“%d”,mem[0])打印它时我得到
0
。为什么?

您给它分配了十六进制数
0x10100000
,它远远大于一个字符,因此不能存储在
字节中。如果您想使用二进制数,并且您的编译器支持此功能,您可以尝试改用
0b10100000

您不能在8位变量(
mem[0]
)中放入32位值。你可能是有意这样做的吗

*(int *)mem = 0x10100000;

无符号字符
通常只能保存0到255之间的值。十六进制值0x10100000远远超出该类型的范围,因此(基本上)只使用该值的低位字节,即0


大概您想要使用一个二进制常量。并不是所有的编译器都支持,但那些支持的编译器会将其指定为0b10100000。对于没有的字符,可以使用十六进制值0xA0。

无符号字符
只能保存
((1
0x10100000
是一个32位的值。您的意思可能是
0xa0
0x10100000
的存储容量远远超过了
无符号字符的存储容量,您意识到这不是二进制数,对吧?这是十六进制无符号文字。如果您的编译器非常新,并且支持即将推出的C23标准(或者有一个允许它的扩展)然后你可以使用前缀为
0b
的二进制代码,就像
0b10100000
@Someprogrammerdude一样,如果你没有那么幸运的话,你可以使用一些模板技巧来达到目的:。似乎不太可能。是的,我把它搞错了…我不小心用了b而不是x,并错误地定义了它们。是的,我应该用“b”来代替,但我把它们混在了一起P
#include <stdio.h>
#include <limits.h>

int main(void)
{
    printf("%u\n", (1 << CHAR_BIT) - 1);
}
#include <stdio.h>
#include <limits.h>
#include <string.h>

typedef unsigned char byte;

int main(void)
{
    byte mem[100];

    memcpy(mem, &(unsigned){0x10100000}, sizeof(0x10100000));

    for(size_t index = 0; index < sizeof(0x10100000); index++)
    {
        printf("mem[%zu] = 0x%hhx\n", index, mem[index]);
    }
}
mem[0] = 0x0
mem[1] = 0x0
mem[2] = 0x10
mem[3] = 0x10
#define b00000000   0
#define b00000001   1
#define b00000010   2
#define b00000011   3

/* .... */
#define b11111110   254
#define b11111110   255
mem[0] = b10100000;