在 C 中从 unsigned 转换为 signed char

标签 c casting char unsigned-char

我正在使用 lame 将输入 raw pcm 流转换为 mp3。该库中的编码函数返回类型为 unsigned char 的数组中的 mp3 编码样本。这个 mp3 编码流现在需要放置在一个 flv 容器中,该容器使用一个函数将编码样本写入 char 数组。我的问题是我将数组从 lame(unsigned char 类型)传递到 flv 库中。下面的一段代码(只是象征性的)说明了我的问题:

/* cast from unsigned char to char. */

#include <stdio.h>
#include <stdlib.h>

void display(char *buff, int len) {

  int i = 0;
  for(i = 0; i < len; i++) {
    printf("buff[%d] = %c\n", i, buff[i]);
  }
}

int main() {

  int len = 10;
  unsigned char* buff = (unsigned char*) malloc(len * sizeof(unsigned char));
  int i = 0;

  for(i = 65; i < (len + 65); i++) {
    buff[i] = (unsigned char) i;
    printf("char = %c", (char) i);
  }

  printf("Displaying array in main.\n");
  for(i = 0; i < len; i++) {
    printf("buff[%d] = %u\n", i, 'buff[i]');
  }

  printf("Displaying array in func.\n");
  display(buff, len);

  return 0;
}

我的问题:
1. 下面代码中的隐式类型转换(如将buff传递给函数display所证明的那样)是否安全?是否可能出现一些奇怪的行为?
2. 鉴于我别无选择,只能坚持使用现有的功能,是否有一种“安全”的方法可以将 unsigned char 数组转换为 char是吗?

最佳答案

unsigned char * 转换为 char *(反之亦然)的唯一问题是它应该是一个错误。用铸件修复它。

display((char *) buff, len);

注意:这个转换是不必要的:

printf("char = %c", (char) i);

这很好:

printf("char = %c", i);

%c 格式化程序以 int arg 开头,因为不可能将 char 传递给 printf( ) 无论如何(它总是会被转换为 int,或者在极不可能的情况下,unsigned int。)

关于在 C 中从 unsigned 转换为 signed char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746889/

相关文章:

c - 为什么 "\r "删除了我之前打印的行,但 "\r"却没有

C:LU完全旋转分解和矩阵求解器;有些不对劲

c# - 从通用抽象类派生类和转换错误?

c++ - 从大 double 静态转换为整数时的奇怪行为

c - 了解C语言中for循环的基础知识

c - 使用 fputc() 写入一个字节

c - 使用硬编码内存地址主机测试 C 程序

将负数连接到二进制数

将 malloc 转换为原始类型

arrays - 有没有办法将 rune 打印为单个字符?