【问题标题】:Store int in 2 chars将 int 存储在 2 个字符中
【发布时间】:2024-01-18 14:20:02
【问题描述】:

快速问题:由于 int 是 2 个字节而 char 是 1 个字节,我想将一个 int 变量存储在 2 个 char 变量中。 (如第一个字符的第 1-8 位,第二个字符的第 9-16 位)。使用 C 作为编程语言。

我怎样才能做到这一点?会是这样的:

int i = 30543;
char c1 = (char) i;
char c2 = (char) (i>>8);

做这份工作?

我不知道将 int 转换为 char 是否只会丢弃 9-16 位。

【问题讨论】:

  • 您无法确保int 是两个字节,但是您可以使用stdint.h 中的int16_t,它保证为2 个字节宽。这是一个有趣的问题,但我认为您找不到特定于 char 的答案,但是如果您考虑一下,将无法在 char 中存储超过 CHAR_BIT 位,因此演员表不需要。
  • "int is two bytes" 提出了一个问题,您使用的是什么编译器? Int 通常是 32 位,所以现在在 32 位和 64 位环境中都是 4 个字节。
  • 我不确定atm,因为它安装在大学PC上,但我的同学告诉我,它是两个字节。不过最好使用 int16_t,100% 肯定,所以谢谢!
  • 发布的代码将导致编译器发出有关丢失数据和/或折叠数据的警告。建议在每个语句中添加 &0xFF

标签: c casting char int


【解决方案1】:

这是从 c11 草案 n1570 中提取的

6.5.4 转换运算符

  1. 如果表达式的值以比要求更大的范围或精度表示 由强制转换命名的类型(6.3.1.8),然后强制转换指定转换,即使 表达式的类型与命名类型相同,并删除任何额外的范围和 精度。

所以强制转换确实会删除额外的位,但无论如何都不需要,因为该值将隐式转换为char,以上内容仍然适用。

【讨论】:

  • 这就是我所需要的,所以上面应该可以工作。谢谢!
【解决方案2】:

你只需要这样做:

char c1 = (char) ((i << 8) >> 8);

char c2 = (char) (i >> 8);

【讨论】:

    最近更新 更多