令人困惑的 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
运算符没有任何关系。而且,当输出一个值时,可以用不同的方式格式化它(例如十六进制与十进制与八进制,前导零与否),这会影响输出的大小
我对 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
运算符没有任何关系。而且,当输出一个值时,可以用不同的方式格式化它(例如十六进制与十进制与八进制,前导零与否),这会影响输出的大小