令人困惑的 sizeof 运算符结果

confusing sizeof operator result

我对 sizeof 结果有点困惑。

我有这个:

unsigned  long part1 = 0x0200000001;
cout << sizeof(part1); // this gives 8 byte

如果我没记错的话,第 1 部分是 9 字节长吧?

谁能帮我解释一下

谢谢 此致

sizeof(part1) returns变量part1的数据类型大小,你定义为unsigned long.

您的编译器 unsigned long 的位大小始终为 64 位,或 8 字节长,即 8 组,每组 8 位。十六进制表示是二进制格式的人类可读形式,其中每个 digit 的长度为 4 位。 为了清楚起见,我们人类经常省略前导零,而计算机从不这样做。

让我们考虑一个数据字节 - char - 和零值。

 - decimal:         0
 - hexadecimal :   0x0   (often written as 0x00)
 - binary:         0000 0000   

有关 C++ 数据类型及其相应位大小的列表,请查看文档(msvc 文档更易于阅读):

对于 msvc:https://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.71).aspx

对于 gcc:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Data-Types

所有编译器都有其数据大小的文档,因为它们取决于硬件编译器本身。如果您使用不同的编译器,google 搜索“'your compiler name' 数据大小”将帮助您找到适合您的编译器的正确大小。

if I count correctly, part 1 is 9 byte long right ?

不,你数错了。 0x0200000001 可以容纳五个字节。一个字节由两个十六进制数字表示。因此,字节为 02 00 00 00 01.

我想你误解了 sizeof 的意思。 sizeof(type) returns 系统保留的字节数 相应类型的任何值 。所以 sizeof(int) 在 32 位系统上可能会给你 4 字节,在 64 位系统上 8 字节,sizeof(char[20]) 给你 20,依此类推. 请注意,也可以使用(类型化)变量的标识符,例如int x; sizeof(x); type 然后从变量 declaration/definition 推导出来,这样 sizeof(x) 在这种情况下与 sizeof(int) 相同。

但是:sizeof 永远不会在运行时解释或分析变量的内容/值,即使 sizeof 听起来有点像。所以 char *x = "Hello, world"; sizeof(x) 而不是 字符串文字 "Hello, world" 的字符串长度,而是 char*.

类型的大小

所以你的 sizeof(part1)sizeof(long) 相同,无论 part1 在运行时的实际内容是什么,它在你的系统上都是 8

unsigned long 的最小范围为 0 to 4294967295,即 4 bytes

0x0200000001 (8589934593) 分配给不够大的 unsigned long 将触发转换,以便它适合您机器上的 unsigned long。此转换是实现定义的,但通常会丢弃较高的位。

sizeof 会告诉您一种类型使用的字节数。它不会告诉你你的值占用了多少字节。

sizeof(part1)(我假设你有错字)给出了 unsigned long(即 sizeof(unsigned long))的大小。因此,无论存储的是什么值,part1 的大小都是相同的。

在您的编译器上,sizeof(unsigned long) 的值为 8。类型的大小是为所有类型定义的实现(除了定义为 1 大小的 char 类型),因此可能因编译器而异。

您期望的 9 的值是通过将 part1 的值写入文件或字符串作为人类可读的十六进制,没有前导零或字首。这与 sizeof 运算符没有任何关系。而且,当输出一个值时,可以用不同的方式格式化它(例如十六进制与十进制与八进制,前导零与否),这会影响输出的大小