Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
char值如何存储在内存中?对于小的和大的endian?_C - Fatal编程技术网

char值如何存储在内存中?对于小的和大的endian?

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) *)请注意,有符号溢出实际上是未定

我试图用c语言打印以下代码的输出,但我不明白它是如何在little endian机器中输出-80的

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
,则没有理由定义转换实现。它是