C++ 在C++;14?

C++ 在C++;14?,c++,endianness,c++14,C++,Endianness,C++14,我试着四处搜索,但没有找到多少关于二进制文字和尾数的信息。二进制文本是小端、大端还是其他(比如匹配目标平台) 例如,0b0111的十进制值是多少?是7点吗?特定于平台?还有别的吗?编辑:我选择了一个错误的值7,因为它在一个字节内表示。尽管如此,这个问题已经得到了充分的回答 一些背景知识:基本上,我试图找出最低有效位的值是什么,用二进制文字屏蔽它似乎是一个很好的方法。。。但前提是有一些关于持久性的保证。简短的回答:没有。把数字写在纸上的方法 长答覆: Endianness永远不会直接在代码中公开,

我试着四处搜索,但没有找到多少关于二进制文字和尾数的信息。二进制文本是小端、大端还是其他(比如匹配目标平台)

例如,
0b0111
的十进制值是多少?是7点吗?特定于平台?还有别的吗?编辑:我选择了一个错误的值7,因为它在一个字节内表示。尽管如此,这个问题已经得到了充分的回答


一些背景知识:基本上,我试图找出最低有效位的值是什么,用二进制文字屏蔽它似乎是一个很好的方法。。。但前提是有一些关于持久性的保证。

简短的回答:没有。把数字写在纸上的方法

长答覆: Endianness永远不会直接在代码中公开,除非您真的尝试将其公开(例如使用指针技巧)
0b0111
是7,它的规则与十六进制相同,即写入

inti=0xAA77;
在某些平台上,这并不意味着
0x77AA
,因为这太荒谬了。对于32位整数,丢失的额外0将流向何处?它们是在前面加上衬垫,然后整个东西翻到
0x77AA0000
,还是在后面加上?如果是这样的话,我不知道有人会期望什么

<> P>点是C++没有对机器的循环性做任何假设,如果使用原语和它提供的文字编写代码,那么行为将从机器到机器是相同的(除非你开始规避类型系统,你可能需要这样做)。 解决你的更新:数字将是你写出来的方式。位不会被重新排序或任何类似的事情,最高有效位在左边,最低有效位在右边


这里似乎对endianness是什么存在误解。Endianness指的是字节在内存中的排序方式以及必须如何解释它们。如果我给你电话号码“4172”,然后说“如果这是四千一百七十二,那么终点是多少”,你就不能给出答案,因为这个问题没有意义。(有人认为左边最大的数字表示大端,但如果没有内存,端的问题就不可回答或不相关)。这只是一个数字,没有要解释的字节,也没有内存地址。假设采用4字节整数表示,与之对应的字节为:

低地址-->高地址
大端点:00 10 4c
小恩迪安:4c 10 00 00
因此,给出其中一个,并告诉“这是计算机4172的内部表示”,你可以确定它是小端还是大端

所以现在考虑你的二进制文字<代码> 0B0111 这4个比特代表一个nBybe,并且可以被存储为

低--->高
大端天:00 07
小端甸:07 00
但您不必在意,因为这也是由硬件处理的,语言规定编译器从左到右读取,从最高有效位到最低有效位

结束不是关于单个位的。假设一个字节是8位,如果我递给你
0b0000111
并说“这是小的还是大端?”你也不能说,因为你只有一个字节(没有地址)。Endianness与字节中位的顺序无关,它指的是整个字节相对于地址的顺序(当然,除非您有一位字节)

你不必关心你的电脑在内部使用什么
0b0111
只需为您节省编写以下内容的时间

unsigned int mask = 7; // only keep the lowest 3 bits
通过写作

unsigned int mask = 0b0111;
无需解释数字的意义


*在c++20中,您可以使用检查尾数。

所有整数文本,包括二进制文本,都以与我们通常读取数字相同的方式进行解释(最左边的数字是最重要的)。

< C++标准保证了文字的相同解释,而不必关注你所处的特定环境。因此,在这种情况下,你不必担心自己的持久性

您的
0b0111
示例始终等于七

C++标准在数字文本方面不使用术语的术语。相反,它只是描述文字具有一致的解释,并且解释是您所期望的

C++标准-整数文本-2.14.2-第1段

整型文字是没有句点或符号的数字序列 指数部分,带有可选的分隔单引号,可忽略 在确定其价值时。整型文字可能有一个前缀 指定其基和指定其类型的后缀从词汇上讲 数字序列的第一个数字是最重要的。A. 二进制整数文字(以2为基数)以0b或0b开头,由 二进制数字序列。八进制整数文字(以八为基数) 从数字0开始,由八进制数字序列组成。 十进制整数文字(以10为基数)以0以外的数字开头 和由一系列十进制数字组成。十六进制整数 文字(十六进制)以0x或0x开头,由一个序列组成 十六进制数字,包括十进制数字和 字母a到f和a到f,十进制值为10到10 十五。[示例:数字12可以写为12、014、0XC或 0b1100。文本1048576、1'048'576、0X100000、0x10'0000和 0'004'000'000都具有相同的值。-结束示例]

术语endian和endia
typedef union
{
    struct {
        int a:1;
        int reserved:31;
    } bits;

    unsigned int value;
} u;

u test;
test.bits.a = 1;
test.bits.reserved = 0;

printf("After bits assignment, test.value = 0x%08X\n", test.value);

test.value = 0x00000001;

printf("After value assignment, test.value = 0x%08X\n", test.value);
After bits assignment, test.value = 0x00000001
After value assignment, test.value = 0x00000001
After bits assignment, test.value = 0x80000000
After value assignment, test.value = 0x00000001