我可以将 size_t 类型的 sizeof 的产出值存储在一个无符号整数 object 中吗?

Can I store the yield value of sizeof of type size_t in an unsigned int object?

sizeof 是标准的 C 运算符。

sizeof 产生类型为 size_t 的操作数的大小(以字节为单位),引自 ISO/IEC 9899:2018 (C18),6.5.3.4/5。被 -- 包围的短语是我为了澄清上下文而添加的:

The value of the result of both operators -- (sizeof and _Alignof) -- is implementation-defined, and its type (an unsigned integer type) is size_t, defined in <stddef.h> (and other headers).

隐含地,如果我希望我的程序符合标准并想使用 sizeof,我需要包含其中定义了 size_t 的 header 文件之一,因为它产生的值是 size_t 类型,我想将该值存储在适当的 object 中。

当然,在任何不是玩具程序的程序中,无论如何我都至少需要其中一个 header,但在一个简单的程序中,我需要明确地包括那些 headers,虽然我不需要它们。

我可以使用 unsigned int object 来存储 size_tsizeof yields 而无需显式转换吗?

例如:

char a[19];
unsigned int b = sizeof(a);

我用 gcc-Wall-Werror 选项标志编译了它,但它没有任何可抱怨的。

但那是standard-conform吗?

原则上是可以的。 unsigned int 几乎可以处理任何 sizeof 除了人工构造的奇异事物。

P.S。即使在 Linux 内核模块中,我也看到过与您类似的代码。

这是允许的,但您有责任确保在类型 unsigned int 的对象中存储类型 size_t 的值不会发生溢出。对于无符号整数类型,溢出是明确定义的行为。

但是,使用并非设计用于存储更宽整数类型的值的类型是一种糟糕的编程风格。这可能是隐藏错误的原因。

通常类型 size_t 是类型 unsigned long 的别名。在某些 64 位系统上,类型 unsigned long 与类型 unsigned long long 具有相同的大小,即 8 个字节而不是 unsigned int 可以存储的 4 个字节。

它完全符合要求,但如果您有非常大的 object(通常为 4GB 或更大),它的大小可能不适合 unsigned int。否则没什么可担心的。

话虽如此,你的问题和这个答案的字符数可能比你在一生的玩具程序中不包含适当的 header 所能节省的字符数还要多。

这是允许的。它是一个 implicit conversion (“好像是通过赋值”)。请参阅标记为“整数转换”的部分:

A value of any integer type can be implicitly converted to any other integer type. Except where covered by promotions and boolean conversions above, the rules are:

  • if the target type can represent the value, the value is unchanged
  • otherwise, if the target type is unsigned, the value 2^(b-1), where b is the number of bits in the target type, is repeatedly subtracted or added to the source value until the result fits in the target type. In other words, unsigned integers implement modulo arithmetic.

换句话说,这始终是定义的行为,但如果大小太大无法放入 unsigned int,它将被截断。