-1

我有一个 unsigned char 并向它添加整数,但我想获取sizeof下一个字节(即sizeof unsigned short intunsigned int等等)。

以下代码演示了我想要的:

#include <stdio.h>

static void write_ushort(unsigned char *b, unsigned short int value) { b[1] = value >> 8; b[0] = value; }
static void write_ulong(unsigned char *b, unsigned long int value) { write_ushort(b + 2, value >> 16); write_ushort(b, value); }

static unsigned short int read_ushort(const unsigned char *b) { return b[1] << 8 | b[0]; }
static unsigned long int read_ulong(const unsigned char *b) { return read_ushort(b + 2) <<16 | read_ushort(b); }

int main() {
     unsigned char b[2];
     unsigned int v0;       /* 4 */
     unsigned short int v1; /* 2 */

     v0 = 200; v1 = 1235;
     write_ushort(&b[0], v0); write_ulong(&b[1], v1);

     /* what i expect printf to output is:
      * 4 2 
      * but it obviously outputs 1 1 */
     printf("%d %d\n", read_ushort(&b[0]), read_ulong(&b[1]));
     printf("%d %d\n", (int)sizeof(b[0]), (int)sizeof(b[1]));
     return 0;
}
4

3 回答 3

2

C 是静态类型的,你不能仅仅通过分配一些东西来改变变量(或数组)的数据类型。实际上,您根本无法更改变量的数据类型:变量(几乎完全)对应于某个内存块,其大小在编译时定义。您可以强制转换变量,以便将它们视为特定操作的不同类型,但内存块的大小始终相同。


而且,由于变量只是一块内存,因此计算机(或编译器)无法知道您正在使用char[2]数组来存储 ashort或 a long。您必须自己跟踪这一点。

于 2012-08-15T06:03:57.583 回答
2

这是不可能的。运算符将sizeof返回类型的大小,或变量声明类型的大小。您无法从中删除任何其他内容,并且在将数字分配给新变量之前,您的代码不会跟踪数字存储在哪种类型的变量中。

无论v0or的类型如何v1,当它们存储在数组的元素中时,它们都会转换为unsigned char.

如果你想4 2作为输出,你需要传递sizeof(v0)sizeof(v1)printf,或者以其他方式跟踪它。

于 2012-08-15T06:05:54.753 回答
1

这是一个主要问题:

write_ulong(&b[1], v1);

您获取第二个字节(双字节数组的)并将其write_ulong作为字节数组处理。这意味着您要在原始数组之外写入几个字节b并覆盖堆栈。这是未定义的行为,会使您的程序表现得非常奇怪。

于 2012-08-15T06:23:03.087 回答