1

我对 C 中的函数有疑问sizeof。我想编写一些函数来获取给定类型的位大小。我是一个新手,对 C 的经验很少,所以我想知道我是否想要一个以下结构,我的输入类型应该是什么?

int bits(  /*what TYPE goes here?*/ input  ) {
    return (8*sizeof( input ));
}

如您所见,我的输入直接传递给 sizeof,那么我应该将哪种类型传递给我的函数原型以使其正常工作?

4

4 回答 4

5

C 是静态类型的,因此您不能将类型传递给函数。没有办法用函数来做到这一点。但是当您使用类似函数的宏时它会起作用:

 #define bits(type) (8*sizeof(type))

 printf ("The type 'int' is %zu bits wide\n", bits(int));

术语 nit pick:sizeof不是函数;它是一个运算符。当参数是表达式时,您可以不使用括号使用它,如

int i;
size_t j = sizeof i;

另请注意,乘以 8 是一个可能错误的假设。对于这些天您可以购买的任何东西,这是一个安全的赌注,但是当内存以千字节(= 1024 :-) 测量时,有一些奇怪的野兽,这是不正确的。C 标准还谈到了可能使问题进一步复杂化的填充位,但我从未在野外见过。

于 2013-10-26T14:32:55.240 回答
3

sizeof不是函数,而是运算符此外,它被评估为编译时常量而不是运行时变量。它采用类型名称或表达式的操作数,但在后一种情况下,它是计算表达式结果的类型的大小。

请注意,虽然在大多数平台上将大小乘以 8 会产生位大小,但并非所有平台都如此(例如,TI TMS320C55x DSP 具有 16 位字符类型)。更安全的方法是使用标准 limits.h 头文件中定义的 CHAR_BIT 宏。

您可以创建一个宏来评估位大小:

#include <limits.h>
#define bit_sizeof(t) (CHAR_BIT * sizeof(t) )

与 sizeof 一样,此宏可以采用类型名称或变量参数,这是函数无法做到的。

于 2013-10-26T14:46:11.363 回答
1

sizeof用于计算任何数据类型的大小。您可以传递原始数据类型(如 anint或 a )float或用户定义的数据类型(如struct.

于 2013-10-26T14:29:27.127 回答
1

sizeof运算符可用于任何数据类型,但不能用于函数类型或位域左值。

您可以拥有任何类型(函数中定义的原始类型或用户类型)

于 2013-10-26T14:32:46.753 回答