免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2003 | 回复: 7

[C] 请教一个关于位移的问题 [复制链接]

论坛徽章:
0
发表于 2009-05-21 14:28 |显示全部楼层
5可用积分
请教各位,下面这两个函数有什么区别?
static int get16(stbi *s)
{
   int z = get8(s);
   return (z << 8) + get8(s);
}
static int get16le(stbi *s)
{
   int z = get8(s);
   return z + (get8(s) << 8);
}

get8的定义如下:
__forceinline static int get8(stbi *s)
{
#ifndef STBI_NO_STDIO
   if (s->img_file) {
      int c = fgetc(s->img_file);
      return c == EOF ? 0 : c;
   }
#endif
   if (s->img_buffer < s->img_buffer_end)
      return *s->img_buffer++;
   return 0;
}

最佳答案

查看完整内容

不一样,在编译的时候决定如何理解图像的每一个字节代表的含义。因为int存储的值和机器的体系结构有关,所以不能直接使用从图像读来的4子介长度数据,而是必须做一个一致的转换。这个类似于socket编程里面的htonl,htons等函数。Plus: 这个__forceinline貌似是Windows下的编译器特有的宏。

论坛徽章:
0
发表于 2009-05-21 14:28 |显示全部楼层
原帖由 weble 于 2009-5-21 14:28 发表
请教各位,下面这两个函数有什么区别?
static int get16(stbi *s)
{
   int z = get8(s);
   return (z img_file);
      return c == EOF ? 0 : c;
   }
#endif
   if (s->img_buffer < s->img_buffe ...


不一样,在编译的时候决定如何理解图像的每一个字节代表的含义。因为int存储的值和机器的体系结构有关,所以不能直接使用从图像读来的4子介长度数据,而是必须做一个一致的转换。这个类似于socket编程里面的htonl,htons等函数。

Plus: 这个__forceinline貌似是Windows下的编译器特有的宏。

论坛徽章:
0
发表于 2009-05-21 14:35 |显示全部楼层
le  = little endian 小字节序吧.

论坛徽章:
0
发表于 2009-05-21 14:37 |显示全部楼层
可以google下big endian和little endian的区别,

论坛徽章:
0
发表于 2009-05-21 14:42 |显示全部楼层
这段代码是一个开源库的,主要是读取图片中的图像数据,可能跟字节序有关吧。不是太清楚这两个函数中的区别,感觉返回值是一样的

论坛徽章:
0
发表于 2009-05-21 14:49 |显示全部楼层

转...

Big endian machine: It thinks the first byte it reads is the biggest.
Little endian machine: It thinks the first byte it reads is the littlest.
举个例子,从内存地址0x0000开始有以下数据
0x0000     0x12
0x0001     0x34
如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出
结果为0x1234;若字节序位little-endian,则读出结果为0x3412.
如果我们将0x1234写入到以0x0000开始的内存中,则结果为
           big-endian     little-endian
0x0000     0x12              0x34
0x0001     0x34              0x12
x86系列CPU都是little-endian的字节序.

论坛徽章:
0
发表于 2009-05-21 15:07 |显示全部楼层
怎么会一样呢,一个是第一个字节左移8位+第二个字节,一个是第一个字节+第二个字节左移8位。确实是考虑big-endian与little-endian的情况
原帖由 weble 于 2009-5-21 14:42 发表
这段代码是一个开源库的,主要是读取图片中的图像数据,可能跟字节序有关吧。不是太清楚这两个函数中的区别,感觉返回值是一样的

论坛徽章:
0
发表于 2009-05-22 18:52 |显示全部楼层
不容易,很长时间没有被评分了。谢谢lz啦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP