如何合并两个 ASCII 字符?
How can I merge two ASCII characters?
我想合并两个字符并使用 ASCII 通过单个变量打印它们(参考下图):
[1]: https://i.stack.imgur.com/TWodP.jpg
根据我的评论,但根据 Jonathan 的意见进行了改进,我建议这样做:
int C;
C= (((unsigned char)a)<<8)|((unsigned char)b);
你已经尝试过评论版本是有帮助的,这个基本上是一样的,只是对 a
和 b
的潜在负值(我认为超出范围,但 Jonathan 尽可能保持安全是对的。
至于说明:
<< 8
部分,即所谓的左移,将值向 MSB 移动 8 位。
IE。 00000000010000001
变成 01000000100000000
.
为了避免出现负值(见下文为什么这很重要),该值首先被类型转换为 unsigned char
。即((unsigned char)a)
部分。请注意,在使用 ()
时我倾向于大方一些,有些人不喜欢那样。这对两个值都完成了。
使用值 'A'
和 'B'
我们最终得到
0100000100000000
和
0000000001000010
.
下一部分使用按位或 (|
),而不是逻辑或 (||
)。
结果是
0100000101000010
,这就是我理解的你的目标。
防止负输入的重要性就在于此。任何负的 8 位值都设置了 MSB,当转换为更宽的数据类型时,将以所有 8 个新的高位设置结束。这是因为在 2-compliment 中用整数表示负值。
如 Jonathan 所解释的那样,最终转换为所需的更宽数据类型:
如果你有(unsigned char)A << 8
作为一个术语,那么unsigned char值在移位发生之前被扩展为int,结果是一个int。
如果你的机器是小端,试试这个
unsigned int C = (b << 8) | a;
printf("%s",&C);
否则,如果您的机器是大端,请尝试
unsigned int C = (a << 24) | (b<<16);
printf("%s",&C);
我想合并两个字符并使用 ASCII 通过单个变量打印它们(参考下图):
[1]: https://i.stack.imgur.com/TWodP.jpg
根据我的评论,但根据 Jonathan 的意见进行了改进,我建议这样做:
int C;
C= (((unsigned char)a)<<8)|((unsigned char)b);
你已经尝试过评论版本是有帮助的,这个基本上是一样的,只是对 a
和 b
的潜在负值(我认为超出范围,但 Jonathan 尽可能保持安全是对的。
至于说明:
<< 8
部分,即所谓的左移,将值向 MSB 移动 8 位。
IE。 00000000010000001
变成 01000000100000000
.
为了避免出现负值(见下文为什么这很重要),该值首先被类型转换为 unsigned char
。即((unsigned char)a)
部分。请注意,在使用 ()
时我倾向于大方一些,有些人不喜欢那样。这对两个值都完成了。
使用值 'A'
和 'B'
我们最终得到
0100000100000000
和
0000000001000010
.
下一部分使用按位或 (|
),而不是逻辑或 (||
)。
结果是
0100000101000010
,这就是我理解的你的目标。
防止负输入的重要性就在于此。任何负的 8 位值都设置了 MSB,当转换为更宽的数据类型时,将以所有 8 个新的高位设置结束。这是因为在 2-compliment 中用整数表示负值。
如 Jonathan 所解释的那样,最终转换为所需的更宽数据类型:
如果你有(unsigned char)A << 8
作为一个术语,那么unsigned char值在移位发生之前被扩展为int,结果是一个int。
如果你的机器是小端,试试这个
unsigned int C = (b << 8) | a;
printf("%s",&C);
否则,如果您的机器是大端,请尝试
unsigned int C = (a << 24) | (b<<16);
printf("%s",&C);