C/C++中的可移植无符号长
portable unsigned long in C/C++
- C++中是否存在可移植的无符号long
- 有没有办法制作一个便携式结构
在我的家用机器上,unsigned long是8字节。在工作机器上它有4个字节。当你在家里启动写在工作上的应用程序时,会出现网络传输数据的正确性问题。
谢谢。
#include <stdint.h>
用于以下类型定义:
(u)int8_t
(u)int16_t
(u)int32_t
(u)int64_t
而最后一个可能可用,也可能不可用,具体取决于平台。
那就不要这么做了。使用协议缓冲区之类的东西在网络上传输内容。将结构转储到文件描述符中是个坏主意,你不应该这么做
如果您有符合C99的C实现,则可以使用<stdint.h>
来确保您使用的类型足够大,可以容纳您发送的数据。但即使这样也不够,因为你的工作机器和家用机器可能有不同的endianes或任何其他问题。<stdint.h>
非常适合确保您的变量足够大,可以容纳所需的全部值,但它们不是确保您可以在网络上轻松传输数据的工具。
正如其他人所提到的,使用标准数据大小将起作用(例如,从stdint.h)
通过将这些数据类型与一些用于使数据结构更具可移植性的技术(如数据结构对齐)结合使用,可以使结构更具移植性。通常,这包括强制每个字段为一定数量的字节,然后在通过网络传输值、将值写入文件等之前将值复制到这些字节中。
大多数平台都有可以使用的名为uint32_t
、uint64_t
等的typedef。据我所知,这些不是标准的,但我使用过的每个平台都有。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++Union/Struct位域的实现和可移植性
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 将有符号整数值转换为可排序的无符号C++的标准兼容方法是什么?
- C/C++中的可移植无符号长
- 将无符号char*缓冲区强制转换为可接受参数的可调用void指针
- 在体系结构之间可移植的有符号二进制表示形式