gpt4 book ai didi

c++ - 基本 C/C++ 类型的值是如何物理存储的?

转载 作者:行者123 更新时间:2023-11-30 21:15:20 24 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我正在玩状态空间,这需要非常有效地存储探索的状态。这意味着,我需要将多个信息存储在一个尽可能小的变量中。

让我们举一个非常简单的例子:假设我想存储两个坐标。我可以创建一个由两个整数组成的结构,但每个整数都是(如果我错了,请纠正我)32b。但我的坐标都不大于 15 .零,它是 16 = 2^4 个不同的值,这意味着我只需要 8b 存储它们。因此,通过一些按位运算符的魔法,我可以将这两个值存储在一个 char 中。 :

unsigned int x, y; // initialized!!!!!
char my_code = (x << 4) | y;

当然,此代码仅在 x 时才有效。和 y存储在“直码”中( 我不确定这个名称。 它是数字的简单二进制表示,从最大位 2^n 到 2^1 )

所以我的问题是: 哪些二进制代码用于存储哪些基本 C/C++ 变量?

编辑:过早优化?不,我目前的任务很小,正在为更大的问题做准备,我需要存储从 0 到 7 的 4 个坐标。这些坐标是 8x8 板上的位置。所以我需要跟踪许多独特的组合——因为状态空间搜索是基于生成新的状态,而这些新状态还没有被探索过。

无法存储多个整数并使用自定义比较器函数和 set .对于像这样的大问题,我的内存会流血,并且跟踪我已经访问过的内容也不会很好。具有可能组合大小的位集可能是最好的方法。 (你可能会说,我描述的那个问题对于 bitset 来说太大了,但是有一个巧妙的技巧来处理它,对于这个问题并不重要。)所以,我需要某种“哈希”,它可以创建很多方式 - 使用模块化算术(一种类型的答案)或按位运算。这两种解决方案之间的复杂性对于今天的计算机来说并没有太大的不同。因为好奇,想用更奇特的第二种方式。但要让它发挥作用,我需要知道数字是如何以二进制级别存储的——如果有一些真实的编码,我的想法会让我的想法完全无法使用。

我的问题也不是关于变量的大小——这些都是有据可查的。

最佳答案

Of course, this code will work only, if x and y are stored in "straight-code"



我猜您要查找的术语是 endianness .然而,不管你的系统是什么字节序, (x << 4) | y给你相同的值(value)。数学是 与字节序无关 .数学只是数学。唯一的区别是内存布局是什么 - 对于单个字节,即使这并不重要。

我们可以通过一个例子来工作。假设 x0x0A0B0C0Dy0x01020304 .如果你的系统是大端的,这意味着内存布局是:
x            : 0A 0B 0C 0D
y : 01 02 03 04
x << 4 : A0 B0 C0 D0
(x << 4) | y : A1 B2 C3 D4
to char : D4

如果是小端:
x            : 0D 0C 0B 0A
y : 04 03 02 01
x << 4 : D0 C0 B0 A0
(x << 4) | y : D4 C3 B2 A1
to char : D4

无论哪种方式, 0xD4 .

虽然,您必须担心的一件事是实际转换为 char .来自 [conv.integral]:

If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [ Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation). —end note ]

If the destination type is signed, the value is unchanged if it can be represented in the destination type; otherwise, the value is implementation-defined.



如果 char是无符号的,那部分是明确定义的。如果是签名的,那就不是。所以更喜欢使用 unsigned char对于 my_code .

关于c++ - 基本 C/C++ 类型的值是如何物理存储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36583533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com