8位,16位,32位,64位操作系统具有不同的数据范围 整数,浮点数和双精度值。
这是编译器还是处理器(8位,16位,32位,64位)。
如果在网络中,来自一个系统的16位整数数据被传输到32位系统 反之亦然,数据会在内存中正确显示。请帮助我理解。
答案 0 :(得分:7)
最终,它取决于编译器。编译器可以自由选择它喜欢的任何数据类型 * ,即使它必须使用软件例程模拟它们的行为。当然,通常,为了提高效率,它将尝试复制底层硬件的本机类型。
至于你的第二个问题,是的,当然,如果你将原始表示从一个架构转移到另一个架构,它可能会被错误地解释(字节序是另一个问题)。这就是使用ntohs()
等函数的原因。
*嗯,不是它喜欢的字面意思。 C标准存在一些约束,例如int
必须至少与short
一样大。
答案 1 :(得分:3)
编译器(更恰当的是“实现”)可以自由选择大小,受C标准的限制。 C为其各种类型提供的一组尺寸部分取决于它运行的硬件;即编译器做出选择但是,它(除了像Java这样的情况,其中数据类型明确独立于底层硬件)受到硬件提供的强烈影响。
答案 2 :(得分:2)
它不仅取决于编译器和操作系统。它取决于架构(至少是处理器)。
当在可能不同的体系结构之间传递数据时,它们使用特殊的固定大小数据类型,例如uint64_t
,uint32_t
代替int
,short
等。
但是整数的大小并不是在具有不同架构的计算机之间进行通信时唯一的问题,也存在字节顺序问题(尝试使用Google搜索BigEndian和LittleEndian)
答案 3 :(得分:1)
给定类型的大小取决于CPU和操作系统上的约定。
如果您想拥有特定大小的int,请使用stdint.h header [wikipedia]。它定义了int8_t
,int16_t
,int32_t
,int64_t
,其他一些及其无符号等价物。
对于不同计算机之间的通信,协议应定义要使用的大小和字节顺序。
答案 4 :(得分:1)
在网络中,必须在协议中定义您拥有的数据大小。对于字节序,强烈建议使用大端值。
如果API没有问题,编译器可以随意设置其short
,int
,long
。通常,API调用连接到这些类型。例如。 open()
函数返回int
,其大小应正确。
但这些类型也可能是ABI定义的一部分。