【发布时间】:2016-11-12 11:34:24
【问题描述】:
考虑以下数据:
char a=12,b=30;
int c=0;
我希望变量 c 将组合值存储为 c=1230。 即 int 数据类型有 2 个字节,第一个字节应该保存 a 的值,第二个字节应该保存 b 的值。 PS:使用运算符的解决方案会很棒,也欢迎任何其他建议。
【问题讨论】:
标签: c memory-management bitwise-operators type-conversion
考虑以下数据:
char a=12,b=30;
int c=0;
我希望变量 c 将组合值存储为 c=1230。 即 int 数据类型有 2 个字节,第一个字节应该保存 a 的值,第二个字节应该保存 b 的值。 PS:使用运算符的解决方案会很棒,也欢迎任何其他建议。
【问题讨论】:
标签: c memory-management bitwise-operators type-conversion
您可以使用按位运算作为替代方案。一个 char 保证为 1 个字节,因此您可以通过移动一个 char 来存储它,然后使用操作 OR 组合它们:
int combine(char c1, char c2) {
return c1 | c2 << 8;
}
然后您可以使用 AND 和右移再次拆分它们:
void split(int in, char *c1, char *c2) {
*c1 = in & 0xff;
*c2 = in >> 8;
}
然而,这不会给你你想要的输出,但它会在一个 int 中存储两个字符。
【讨论】:
1230 = 12*100 + 30。看来您可以将a*100+b 分配给c。
但如果 a 或 b 不在 0..99(含)范围内,则可能无法按您希望的方式工作。
【讨论】:
你也可以使用这样的联合
typedef union {
char bytes[2];
int integer;
} combined;
然后像这样存储字符
char a = 12;
char b = 30;
combined c;
c.bytes[0] = a;
c.bytes[1] = b;
和 c.integer 现在将存储这两个字符。但请注意,由于int 通常为 32 位宽,其中 16 位将是“随机的”,因此您无法比较以这种方式创建的两个 ints。更好的选择是short。
与其他答案一样,这不会为您提供所需的输出,而只是将两个字符存储在 int 中的一种方式。
【讨论】: