【发布时间】:2020-06-19 02:43:06
【问题描述】:
sizeof 是标准 C 运算符。
sizeof 产生size_t 类型的操作数的大小(以字节为单位),引用自 ISO/IEC 9899:2018 (C18), 6.5.3.4/5。 -- 包围的短语是我为了澄清上下文而添加的:
两个运算符的结果值——(sizeof 和 _Alignof)——是实现定义的,其类型(无符号整数类型)是
size_t,在<stddef.h>(和其他头文件)中定义。
隐含地,如果我希望我的程序符合标准并希望使用sizeof,我需要包含一个定义了size_t 的头文件,因为它产生的值是size_t 类型我想将值存储在适当的对象中。
当然,在任何不是玩具程序的程序中,我都需要至少一个这些头文件,但在一个简单的程序中,我需要明确包含这些头文件,尽管我不需要它们.
我可以使用无符号 int 对象来存储 size_t 值 sizeof 产生而不需要显式转换吗?
例如:
char a[19];
unsigned int b = sizeof(a);
我用 gcc 和 -Wall 和 -Werror 选项标志编译了它,但它没有什么可抱怨的。
但这符合标准吗?
【问题讨论】:
-
只要数字足够小以适合无符号整数。
-
@user253751 只要它在
unsigned int的范围内,顺便说一句,这真的不是那么小,这样就可以了? -
IMO
unsigned int b = sizeof(a);形式上是错误的,因为如果sizeof是 64 位,unsigned int是 32 位,如果a的大小大于 0xffffffff(即不过不太可能)。 -
@Jabberwocky 什么是 f.e.
unsigned long还是unsigned long long int?那会更合适吗? -
@RobertSsupportsMonicaCellio 标准中说
long int大于或等于int类型的大小,所以没有没有保证。最好使用size_t。但正如我之前提到的,如果你的对象大小是“合理的”,你可以务实地使用任何无符号的 32 位类型。
标签: c type-conversion sizeof unsigned-integer size-t