【问题标题】:Convert an int into a 4 byte char array in C [duplicate]将 int 转换为 C 中的 4 字节 char 数组 [重复]
【发布时间】:2012-07-11 19:07:53
【问题描述】:

可能重复:
Converting an int into a 4 byte char array (C)

使用动态 C 程序(语言是 C),我试图将一个 int 转换为一个 4 位长的字节数组。到目前为止,我在网上查了一些例子。但是,似乎没有一个对我有用。我遇到了一个持续的问题,即打印了正确的字节数,但由于某种原因它们重复了两次。我提供了以下代码:

void main(){
 int a=1379;
 int i=0;
 unsigned char value [4];

value[3] = (byte) (a & (0xFF));
value[2] = (byte) ((a >> 8) & 0xFF);
value[1] = (byte) ((a >> 16) & 0xFF);
value[0] = (byte) ((a >> 24) & 0xFF);
//convert int values to bytes by placing them in a char buffer

for(i=0;i<4;i++){
 printf("%d",value[i]);
 printf(", ");
 }
printf("\n");
}

例如,使用此值,程序会打印“5, 99, 5, 99”,而它应该打印“0, 0, 5, 99”。感谢您的帮助。

【问题讨论】:

  • 有些事情你没有告诉我们。
  • 我认为这是一种具有 16 位整数的语言(用于微控制器)。
  • 你应该初始化你的数组,unsigned char value[4] = {0};
  • @pstrjds -- 仅仅因为标题相同并不意味着它是一个骗子。
  • 1) main 应该返回 int 2) 删除 (byte) 强制转换(什么是字节?)它们只会造成伤害。 3)移位有符号整数将对它们进行符号扩展,最好使用无符号实体进行移位。 4) 使用 %u printf 格式打印无符号类型。 5)您假设 32 位整数,并且 CHAR_BIT=8。 6) sizeof 是你的朋友。

标签: c arrays char byte


【解决方案1】:

几乎可以肯定,“动态 C”是一个具有 16 位 int 的实现,这对于 C 来说是完全“合法的”。如果 int 是 16 位,则任何超过 16 位的移位都是模数-16,因此后两个班次与前两个班次重复。

【讨论】:

  • +1 因为这要么是答案要么是重复的问题:)
  • 更多信息,基于此页面http://www.rabbitsemiconductor.com.cn/products/dc/index.shtml提到动态c 32,我猜动态c有16位int
  • @pstrjds 这根本不是一个重复的问题。另一个问题没有提到这个问题的行为,即表示 16 位机器的行为。
  • @JimBalter - 我添加了一张笑脸,以指出我在开玩笑。进一步阅读后,我意识到这不是重复的,并且正在回应我已经意识到并支持他的正确答案的 Hot Licks。
  • 我相信它实际上 UB 移动超过了变量的长度,这可能值得这么说。编译器可能只是碰巧做了一些明智的事情。
【解决方案2】:

您需要将 int 变量中的位复制到 char 数组中。您可以像这样使用memcpy 简单地做到这一点:

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

void split(int val, unsigned char *arr) {
    memcpy(arr, &val, sizeof(int));
}

int main() {
    unsigned char bytes[4];
    split(1379, bytes);
    printf("%d, %d, %d, %d\n", bytes[0], bytes[1], bytes[2], bytes[3]);
}

【讨论】:

  • 为什么我被投了反对票?请解释一下。
【解决方案3】:
#include <stdio.h>
#include <string.h>

int main(void){
 int a=1379;
 unsigned bot,top ;
 unsigned char value [sizeof a];

 memcpy (value, &a, sizeof value);

 /* You can omit this loop if you are on a big-endian machine */
#if LITTLE_ENDIAN
 for (bot =0, top = sizeof value; --top > bot; bot++) {
    unsigned char tmp;
    tmp = value[bot];
    value [bot] = value[top];
    value[top] = tmp;
    }
#endif

for(bot=0;bot < sizeof value;bot++){
 printf("%u", (unsigned int) value[bot]);
 printf(", ");
 }
printf("\n");
return 0;
}

【讨论】:

  • 他会把这地方弄得臭臭的。
  • '不要警告我。但我怀疑这是因为代码难以理解。
  • 代码对整数或字符的大小不做任何假设;这就是为什么其中没有明显的常量。 (无论如何,gcc 会展开“愚蠢的”循环)
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多