当我读取一些代码时,对于整数,它们使用一堆不同的类型,例如size_t, uint32, uint64
等。
这样做的动机或目的是什么?
为什么不使用int
?
与平台交叉相关?或低级相关。
有时,代码对我有意义,因为他们只需要32位int
或其他东西。
但是,size_t
是什么?
请帮我说清楚。
答案 0 :(得分:15)
这些是为了平台独立性。
根据定义, size_t
是sizeof
返回的类型。它足以表示目标系统上的最大对象。
不是很多年前,32位对于任何平台来说已经足够了。今天64位就足够了。但谁知道从现在开始5年,10年或50年需要多少比特?
通过编写代码而不关心 - 即,当你的意思是“对象的大小”时,总是使用size_t
- 你可以编写实际编译并运行5年,10年或50年的代码现在。或者至少有一个战斗机会。
使用类型来表达你的意思。如果由于某种原因需要特定数量的位(可能仅在处理外部定义的格式时),请使用特定于大小的类型。如果你想要的东西是“机器的自然字大小” - 即快速 - 使用int
。
如果您正在处理类似sizeof
或strlen
的程序,请使用适合该界面的数据类型,例如size_t
。
并且永远不要尝试将一种类型分配给另一种类型,除非它足够大以按照定义保存该值。
答案 1 :(得分:3)
使用它们的动机是因为你不能依靠int
,short
或long
来获得任何特定的大小 - 这是一个错误太多程序员过去太多次了。如果你看起来不是历史悠久,那么从16位处理器转换到32位处理器,这会破坏大量代码,因为人们错误地依赖int
为16位。此后,当人们依赖int
为32位时仍然犯了同样的错误,直到今天仍然如此。
更不用说术语int
,short
和long
已经被语言设计师真正认可,他们都决定让它们意味着不同的东西。读取某些C的Java程序员会天真地期望long
表示64位。这些术语真的毫无意义 - 它们没有指定关于类型的任何内容,每当我看到一个仍然使用这些术语的新语言时,我都会面对。
标准的int类型是必需的,因此您可以使用您想要使用的类型。他们应该在几十年前推荐int
,short
和long
。
答案 2 :(得分:2)
有关size_t的信息,请参阅Stack Overflow问题:What is size_t in C?
uint32和uint64对于他们想要的位数是特定的,并且编译器应该将它们解释为无符号。
答案 3 :(得分:1)
为整数值选择基础类型有很多可能的原因。最明显的一个是你可以存储的最大可能值的大小 - uint32将能够存储两倍于int32的数字,这可能是可取的。 int64将能够存储一个比int32大得多的数字 - 最多2 ^ 63 - 1而不是2 ^ 31 - 1.
还有其他可能的原因。如果您直接从某些源(文件,套接字等)读取二进制数据,则必须确保正确解释它。如果有人写了uint32并将其解释为int32,则可能会将非常大的正数解释为负数(溢出)。
size_t只是unsigned int的typedef,我相信通常是32位。
答案 4 :(得分:1)
对于大多数日常编程,整数的大小并不重要。但有时候具体是好的。这在低级或嵌入式编程中特别有用。另一个有用的地方是科学或计算密集型任务,使用大于必要的int可能会浪费。
size_t的优点是它是无符号的。一方面,使用size_t很好,因为它增加了关于参数应该是什么的更多信息(即不是negitave)。另一方面,它与unsigned int
相比不那么紧张。