char值如何存储在内存中?对于小的和大的endian?
我试图用c语言打印以下代码的输出,但我不明白它是如何在little endian机器中输出-80的char值如何存储在内存中?对于小的和大的endian?,c,C,我试图用c语言打印以下代码的输出,但我不明白它是如何在little endian机器中输出-80的 char d = 1200; printf ("%d ", d); Endianness与此无关。我假设您有8位char。因此,您尝试为不合适的char分配一个整数常量,1200是0x4b0。C通过切断最高有效位进行转换,结果是0xb0*) 它被解释为有符号数,为负数(最高有效位集),其值为80(将位反转为0x4f,以十进制80表示,二者相加的补码为0x50) *)请注意,有符号溢出实际上是未定
char d = 1200;
printf ("%d ", d);
Endianness与此无关。我假设您有8位
char
。因此,您尝试为不合适的char
分配一个整数常量,1200
是0x4b0
。C通过切断最高有效位进行转换,结果是0xb0
*)
它被解释为有符号数,为负数(最高有效位集),其值为80
(将位反转为0x4f
,以十进制80表示,二者相加的补码为0x50
)
*)请注意,有符号溢出实际上是未定义的,因此您可以得到任何其他结果。我只是描述一下这里可能发生的情况,假设你的机器使用2的负数补码。无符号溢出将通过切割最高有效位来定义,同样,这与endianness无关。endianness与此无关。我假设您有8位
char
。因此,您尝试为不合适的char
分配一个整数常量,1200
是0x4b0
。C通过切断最高有效位进行转换,结果是0xb0
*)
它被解释为有符号数,为负数(最高有效位集),其值为80
(将位反转为0x4f
,以十进制80表示,二者相加的补码为0x50
)
*)请注意,有符号溢出实际上是未定义的,因此您可以得到任何其他结果。我只是描述一下这里可能发生的情况,假设你的机器使用2的负数补码。无符号溢出将通过切割最重要的位来定义,同样,这不是结束的问题。为什么它会变成
-80
,我不知道
但是,发生错误的原因是1200
对于char
数据类型来说太大。它是为数不多的保证为单字节大小的C原语之一。这也意味着您不必担心endianness
因此,有效范围为-128
到127
。根据该标准,尝试分配该范围之外的变量是“实现定义的”。也就是说,编译器可以做自己喜欢做的事情
ISO/IEC 9899:2011标准第6.3.1.3节:
6.3.1.3有符号和无符号整数
当一个整数类型的值被转换为另一个整数类型[并且]新类型被签名,并且该值不能在其中表示时,[然后]结果是实现定义的
我不知道为什么它会变成
-80
但是,发生错误的原因是1200
对于char
数据类型来说太大。它是为数不多的保证为单字节大小的C原语之一。这也意味着您不必担心endianness
因此,有效范围为-128
到127
。根据该标准,尝试分配该范围之外的变量是“实现定义的”。也就是说,编译器可以做自己喜欢做的事情
ISO/IEC 9899:2011标准第6.3.1.3节:
6.3.1.3有符号和无符号整数
当一个整数类型的值被转换为另一个整数类型[并且]新类型被签名,并且该值不能在其中表示时,[然后]结果是实现定义的
1200可能是
char
的无效值。并且您的d
可能只存储在寄存器中,或者由编译器折叠的常量中。最后,这不是一个结尾的问题,而是有符号字符
与无符号字符
(系统上的字符是什么是特定于实现的)行为是未定义的,因为字符d
不能表示1200
。但可能发生的情况是,1200
十进制是4B0
十六进制被截断为8位B0
十六进制,因为char
是有符号的,所以是-80
十进制的两位补码。endianness是不相关的。@WeatherVane-它不只是实现定义的而不是未定义的吗?1200很可能是char
的无效值。并且您的d
可能只存储在寄存器中,或者由编译器折叠的常量中。最后,这不是一个结尾的问题,而是有符号字符
与无符号字符
(系统上的字符是什么是特定于实现的)行为是未定义的,因为字符d
不能表示1200
。但可能发生的情况是,1200
十进制是4B0
十六进制被截断为8位B0
十六进制,因为char
是有符号的,所以是-80
十进制的两位补码。endianness是不相关的。@WeatherVane-它不只是实现定义的而不是未定义的吗?范围允许更大,一个char
可能超过8位。严格来说,标准只指定范围-127
到127
。如果SCHAR_MIN
是-128
,则没有理由定义转换实现。它是-80
,因为1200
的前8位是10110000
,作为有符号值是-80
或176
作为无符号值。范围允许更大,char
的位数可能超过8位。严格来说,该标准仅规定了-127
到127
的范围。如果SCHAR\u MIN
是-128
,则没有理由定义转换实现。它是