有符号数与无符号数运算

今天遇到一个bug,当AudioFlinger从AudioStreamInALSA::read()返回时,其实是有可能返回一个负数的,但是当应该返回一个负数时,却返回一个超级大的正数,查了半天,终于明白是有符号正数与无符号正数在一个表达式运算时,会强制转换引发的错误。C语言中,当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型

 

ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes)

{
 return static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle->handle, n));
}
当n=-32时,上面static_cast<ssize_t>(snd_pcm_frames_to_bytes(mHandle->handle, n))是一个非常大的正数

ssize_t snd_pcm_frames_to_bytes(snd_pcm_t *pcm, snd_pcm_sframes_t frames)
{
 assert(pcm);
 if (CHECK_SANITY(! pcm->setup)) {
  SNDMSG("PCM not set up");
  return -EIO;
 }
 return frames * pcm->frame_bits / 8;
}

 

这是因为pcm->frame_bits是一个无符号整数,首先frames会转换成无符号整数,当frames=-32,就是一个非常大的整数了,frames * pcm->frame_bits / 8也就是一个非常大的整数了。turn时再换回有符号整数时,也是一个大整数了

alsa-lib/src/pcmpcm_local.h
struct _snd_pcm

{

  unsigned int frame_bits;

}

你可能感兴趣的:(c,buffer,UP,语言)