为什么这个示例不依赖于字节序? [已关闭]

问题描述 投票:0回答:2

https://cppquiz.org/quiz/question/249

#include <iostream>

using namespace std;

int main() {
    int a = '0';
    char const &b = a;
    cout << b;
    a++;
    cout << b;
}

我知道这里的答案,但想知道为什么这不是实现定义的......即依赖于机器?

如果您在一台大端机器上运行此代码,然后重新编译并在一台小端机器上运行它会怎么样?

当您尝试在 cout 中打印文字字符“ ”时,它不会打印“0”。

c++ endianness
2个回答
5
投票

您没有将引用绑定到

a
的第一个字节,而是将右侧评估为
int&
并保持
0x30
,此引用将转换为临时
char
0x30
并且引用为绑定到这个临时字符,而不是
a

内存布局在任何时候都不重要。将

int
转换为
char
定义为
mod 256
(假设无符号 8 位
char
)。确保实现这一点取决于实施。

当然,在非 8 位原生大端架构上,转换可能涉及将最高字节移至最低位置,以便将寄存器用作 true

char
,但这些是其他人需要处理的技术细节。


1
投票

您将

b
绑定到
a
的临时副本(或者更确切地说,
a
的低位字节),而不是
a
本身。
a
char
的隐式转换会创建一个临时值。

如果您想查看由于字节顺序而引起的更改,则需要使用指针(使用适当的强制转换和取消引用运算符):

#include <iostream>

int
main()
{
    int                 a = '0';
    char const*         b = reinterpret_cast<char const*>( &a );
    std::cout << *b << std::endl;
    ++ a;
    std::cout << *b << std::endl;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.