当前位置: 首页 > 面试题库 >

sizeof运算符的实现

单于智
2023-03-14
问题内容

我已经尝试实现sizeof运算符。

#define my_sizeof(x) ((&x + 1) - &x)

但是,对于任何一种数据类型,结果总是以“ 1”表示。

然后,我为此搜索了一下..,我发现代码是 强制转换的

#define my_size(x) ((char *)(&x + 1) - (char *)&x)

如果代码是强制转换的,那么代码也可以正常工作。.我不明白为什么..该代码也完美地填充了结构。

它也为

#define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x)

有人能解释一下如果进行类型转换和未进行类型转换如何工作吗?

提前致谢..


问题答案:

指针减法的结果以 元素 为单位,而不是以字节为单位。因此,第一个表达式1的定义为。

除此之外,您确实应该在宏中使用括号:

#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)

否则,尝试my_sizeof()在表达式中使用可能导致错误。



 类似资料:
  • C++ 运算符 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。 sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。 使用 sizeof 的语法如下: sizeof (data type) 其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。 请尝试下面的实例,理解 C++ 中 size

  • 本文向大家介绍C语言位运算和sizeof运算符详解,包括了C语言位运算和sizeof运算符详解的使用技巧和注意事项,需要的朋友参考一下 位运算和sizeof运算符       C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。位运算主要有6种:与(&),或(|),取反(~),异或(^),左

  • sizeof是一个关键字,但它是一个编译时运算符,用于确定变量或数据类型的大小(以字节为单位)。 sizeof运算符可用于获取类,结构,联合和任何其他用户定义数据类型的大小。 使用sizeof的语法如下 - sizeof (data type) 数据类型是所需的数据类型,包括类,结构,联合和任何其他用户定义的数据类型。 尝试以下示例以了解C ++中可用的所有sizeof运算符。 在test.cp

  • 假设: 2的补码形式的32位有符号整数 true和false是值为1和0的整数 java运算符 你能实现像<代码>

  • 为什么运算符只应该是4个字节却生成12个字节?当我引用变量时,这只是引用数组第一个索引的内存地址。实际上,我打印了第一个索引的内存地址,并将其与进行了比较,它们产生了相同的内存地址结果,这证实了它们都引用了数组的第一个索引,但是“array”产生了12个字节,而产生了4个字节。

  • 主要内容:实例位运算符 Erlang提供四个位运算符。以下是在 Erlang 可用的位运算符。 S.No. 操作符 & 描述 1 band 位 “and”运算符 2 bor 位 “or” 运算符 3 bxor 位 “xor”或异运算符 4 bnot 按位反运算符 以下是这些运算符真值表显示 - p q p & q p | q p ^ q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1