gpt4 book ai didi

c - unsigned char 和 char 异或运算

转载 作者:行者123 更新时间:2023-11-30 15:10:52 25 4
gpt4 key购买 nike

有谁能帮我解释一下 XOR 运算中 unsigned char 和 char 的区别吗?

#include <stdio.h>

int main() {
char a[2] = { 0x56, 0xa5 }; // a[0] 0101 0110
// a[1] 1010 0101
a[0] = a[0] ^ a[1]; // a[0] 1111 0011 f3
printf("%02x", a[0]);
puts("");

unsigned char b[2] = { 0x56, 0xa5 }; // b[0] 0101 0110
// b[1] 1010 0101
b[0] = b[0] ^ b[1]; // b[0] 1111 0011 f3
printf("%02x", b[0]);
puts("");
}

结果:

fffffff3
f3
[Finished in 0.0s]

另一个例子:

#include <stdio.h>

int main() {
char a[2] = { 0x01, 0x0a };

a[0] = a[0] ^ a[1];
printf("%02x", a[0]);
puts("");

unsigned char b[2] = { 0x01, 0x0a };

b[0] = b[0] ^ b[1];
printf("%02x", b[0]);
puts("");
}

结果:

0b
0b
[Finished in 0.0s]

最佳答案

在第一种情况下,您的代码

printf("%02x", a[0]);

char 值传递给可变参数函数 printfchar 值被提升为 int 类型并按此传递。 a[0] 的值为 -13 因为 char 类型在您的环境中恰好是默认签名的,该值由促销为 int,printf 将其作为 int 接收。

格式%02x需要一个unsigned int值。 printf 传递了一个 int 值,这是一个调用未定义行为的不正确类型。由于 intunsigned int 在您的平台上使用相同的参数传递约定,因此 -13 的负值将被解释为 unsigned int 具有相同的位模式,值为 0xFFFFFFF3,因为您平台上的 int 有 32 位,负值以 2 补码表示。 printf 生成的字符串是 fffffff3。 C 标准实际上并没有保证这种行为。

在第二个示例中,b[0] 是一个 unsigned char,值为 243 (0xf3) 。它升级为 int 并保留该值,并且传递给 printfint243。当 printf 传递一个 int 而不是 unsigned int 时,会调用相同的未定义行为。在您的特定情况下,由 printf 执行的转换会产生相同的值,该值打印为十六进制,并用前导 0 填充至少 2 位数字,给出 f3.

为了避免这种歧义,您应该将操作数转换为 unsigned char:

printf("%02x", (unsigned)(unsigned char)a[0]);

或者将其实际类型指定为unsigned char:

printf("%02hhx", (unsigned char)a[0]);

关于c - unsigned char 和 char 异或运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35973275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com