为什么要打印;0“&引用;1“;作为字符,有时作为ASCII 48/49?

为什么要打印;0“&引用;1“;作为字符,有时作为ASCII 48/49?,c,C,我是C语言的初学者。我在编写代码时注意到了这一点 要对字符数组中的元素进行异或运算,为什么有些显示0/1,有些显示ASCII?我如何让它们都像数字0或1那样工作 在函数XOR中,我想对两个数组中的元素进行XOR,并将结果存储在另一个数组中 大体上,我做了一些实验 顺便说一下,除了打印结果,我还想做01二进制运算。例如加密和解密 这是一段C代码 #include <stdio.h> #include <stdlib.h> #include <string.h>

我是C语言的初学者。我在编写代码时注意到了这一点

要对字符数组中的元素进行异或运算,为什么有些显示0/1,有些显示ASCII?我如何让它们都像数字0或1那样工作

在函数XOR中,我想对两个数组中的元素进行XOR,并将结果存储在另一个数组中

大体上,我做了一些实验

顺便说一下,除了打印结果,我还想做01二进制运算。例如加密和解密

这是一段C代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int XOR(char *u, char *w, char *v)
{
    for(int i = 0; i < 16; i++)
    {
        u[i] = w[i] ^ v[i];
    }

    return 0;
}

int PrintList(char *list, int n)
{
    for(int i = 0; i < n; i++)
    {
        printf("%d", list[i]);
    }
    return 0;
}

int main()
{
    char u[17] = "";
    char w[17] = "0001001000110100";
    char v[17] = "0100001100100001";

    XOR(u, w, v);
    PrintList(u, 16);
    printf("\n");

    char w2[17] = "1000110011101111";
    XOR(u, w2, v);
    PrintList(u, 16);
    printf("\n");

    char v2[17] = "1111111011001000";
    XOR(u, w2, v2);
    PrintList(u, 16);
    printf("\n");

    char x[17] = "0101101001011010";
    XOR(u, x, u);
    PrintList(u, 16);
    printf("\n");

    memcpy(w, u, 16);
    XOR(u, w, v);
    PrintList(u, 16);
    printf("\n");

    return 0;
}

那么,将我的声明从
char
更改为
unsigned char
,可能是由于
printf(“%d”,list[i])打印结果没有变化。更改为
printf(“%c”,列表[i])打印结果:




0010100001111101


Process returned 0 (0x0)   execution time : 0.041 s
Press any key to continue.

这些是字符串,因此您最初有ASCII码48(0011 0000)和49(0011 0001)。
^
运算符是按位异或的,因此值为48和49的两个操作数的结果可以是0或1。当您将结果打印为整数时,您将得到预期的0或1


但是,如果以后使用该操作的结果,则不再有ASCII码数组,而是值为0或1的整数数组。如果使用仍然是ASCII码数组的数组对该数组进行异或,例如
00110000^0
,则将得到结果
00110000
,而不是
0
。printf会给你48个等。

这些是字符串,所以你最初有ASCII码48(0011 0000)和49(0011 0001)。
^
运算符是按位异或的,因此值为48和49的两个操作数的结果可以是0或1。当您将结果打印为整数时,您将得到预期的0或1


但是,如果以后使用该操作的结果,则不再有ASCII码数组,而是值为0或1的整数数组。如果使用仍然是ASCII码数组的数组对该数组进行异或,例如
00110000^0
,则将得到结果
00110000
,而不是
0
。所以printf会给你48个字符,等等。

字符“0”是‭00110000‬ 二进制的。”1’是00110001

'0' ^ '0' = 00000000 (0)
'0' ^ '1' = 00000001 (1)
'1' ^ '1' = 00000000 (0)
但随后您将重用
u
数组

'0' ^ 0 = 0011000 (48)
'0' ^ 1 = 0011001 (49)
'1' ^ 0 = 0011001 (49)
'1' ^ 1 = 0011000 (48)

字符“0”为空‭00110000‬ 二进制的。”1’是00110001

'0' ^ '0' = 00000000 (0)
'0' ^ '1' = 00000001 (1)
'1' ^ '1' = 00000000 (0)
但随后您将重用
u
数组

'0' ^ 0 = 0011000 (48)
'0' ^ 1 = 0011001 (49)
'1' ^ 0 = 0011001 (49)
'1' ^ 1 = 0011000 (48)

在这种特殊情况下,请阅读@FoggyDay,无任何内容。对于原始二进制数据总是使用
uint8_t
,这是一种很好的做法,但是对于字符串使用
char
也可以(只有在那时)。在这种特殊情况下,读取@FoggyDay,不读取任何内容。对于原始二进制数据总是使用
uint8\t
,这是一种很好的做法,但是对于字符串使用
char
是很好的(只有这样)。