char或unsigned char给int赋值区别
来源:互联网 发布:香港大学网络教育 编辑:程序博客网 时间:2024/06/05 17:37
这段时间写了一个简单的游戏网络框架,里面套接字收发自己实现了一个Buffer,今天零散时间想实现一下Buffer提供read_int和write_int方法,大致代码如下
int buffer::read_int(void){// 循环以BYTE位的方式填充整形int value = _buffer[_start_offset++];for (size_t i = 1; i < sizeof(int); i++) {value = value << 8;value |= _buffer[_start_offset++];}return value;}void buffer::write_int(int value){// 循环以BYTE位的方式写入缓存for (int i = sizeof(int)-1; i >= 0; i--)_buffer[_valid_offset++] = ((value >> (i * 8)) & 0xFF);}
首先先解释一下为什么要这样写,这样实现为了避免产生大小端问题,因为我们统一采用上面的读取和写入方法,肯定不会有大小端问题
这里简单解释一下大小端,若想详细了解,百度一下你会知道的更多,下面引用百度百科中的两句话
所谓的大端模式,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中
所谓的小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
举个例子,可能会更好理解,请拿出桌面的计算器
十进制:4160486910 十六进制:F7FBFDFE 存储在小端的计算机中将是FEFDFBF7,数据的低字节是FE,保存的内存的低地址,由左至右就是由低到高,所以若是查看内存的话你首先看到的将是FE,当然大端正好是相反的。
接下来开始聊我今天碰到的问题,问题主要出在read_int中,就拿第一行代码举例说明,若_buffer[_start_offset++] = 0xF7,第一句执行的结果是 0xFFFFFFF7,若是仅看这一句当然也没有什么大问题,左移之后变成0xFFFFF700,假设此时_buffer[_start_offset++] = 0xFB,或运算之后就变成了0xFFFFFFFB,即便我用的是抑或运算,运算结果也是0x8FB,其实这样运算也并不是我想出来的,怎么就不对了呢,更何况我以前还用过,然后就是无穷无尽的测试。
其实这个时间我已经能说出来为什么出这样的问题啦,为什么第一行赋值的结果不是0x000000F7即0xF7
然后无意中发现这篇文章:http://bbs.csdn.net/topics/380177608
问题根源就是我_buffer用的是char *而不是unsigned char*啊
- char或unsigned char给int赋值区别
- unsigned char, unsigned int
- 用unsigned char 赋值给Mat
- 关于unsigned short,char,unsigned int 之间的赋值
- char、unsigned char区别
- unsigned int get_svrport(char *, char *, unsigned int);
- 关于char型赋值给int型
- char和short 给int赋值或与int比较时 需要特别注意
- 闲话unsigned: unsigned int vs. int, unsigned char vs char.
- unsigned char * 与 char *区别
- char与unsigned char 区别
- char 和unsigned char 区别
- char, signed char, unsigned char的区别
- char、signed char、unsigned char的区别
- unsigned char 数据类型的赋值
- const char * 赋值给 char*
- unsigned int 转化成 unsigned char*
- char, signed char,unsigned char, short int unsigned short int, int数据类型取值问题
- 正则表达式工作原理
- Windows8和Windows10系统改装Win7系统的问题和解决办法
- RTSP协议(一)
- Difference between HEAD / Working Tree / Index in Git
- C++primer 4.4 多维数组、指针数组、数组指针(未完)
- char或unsigned char给int赋值区别
- linux下mysql中文乱码问题
- 如何在Qt Creator中调试Ubuntu Scope
- Linux下用memory方式访问PCIE空间
- webview中html页面开发注意事项
- linux下解决mysql区分大小写问题
- Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
- 在URL中传递中文的解决方式
- Android简单自定义圆形和水平ProgressBar