Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
C、 小整数到大整数的转换_C - Fatal编程技术网

C、 小整数到大整数的转换

C、 小整数到大整数的转换,c,C,当从较小的int(负值)转换为较大的uint时,该值应该是什么? 例如: 我期待0x80,来自C标准,如下所示: 0x80+0xFFFF=0x0079, 然后加1得到0x0080 但我的模拟器给出的大单位结果是0xFF80。 我试了8=>16、16=>32和32=>64次。所有结果都相同(即符号扩展) 这是因为编译器实际执行以下操作: uint16_t big_uint = (uint16_t)((int16_t)small_int); 如果是这样的话,有人能用一个简单的例子来澄清6.3.1

当从较小的int(负值)转换为较大的uint时,该值应该是什么? 例如:

我期待0x80,来自C标准,如下所示:

0x80+0xFFFF=0x0079, 然后加1得到0x0080

但我的模拟器给出的大单位结果是0xFF80。 我试了8=>16、16=>32和32=>64次。所有结果都相同(即符号扩展) 这是因为编译器实际执行以下操作:

uint16_t big_uint = (uint16_t)((int16_t)small_int);

如果是这样的话,有人能用一个简单的例子来澄清6.3.1.3第2部分的实际含义吗?

存储在有符号8位int中的值0x80的值为-128。因此,新值是旧值-128,重复添加0x10000,得到0xff80


没有到int16\t的中间转换。不需要。加法是用实际的数学值完成的。

存储在有符号8位整数中的值0x80的值为-128。因此,新值是旧值-128,重复添加0x10000,得到0xff80


没有到int16\t的中间转换。不需要。加法是用实际的数学值来完成的。

int8\u t
是一种二的补码类型,因此其中的10000000位表示−128

对于
uint16_t
,比
uint16_t
中可以表示的最大值多出一个值,即比65535(十六进制FFFF)多出一个值,即65536(十六进制10000)

−128加65536等于65408,十六进制为FF80


不过,备份时,您的第一个声明中有一个问题:
int8\t small\u int=0x80
int8\u t
可以表示−128至+127。但是
0x80
表示值128。它不合适。当它用于初始化
int8\t
时,将执行转换。根据C 2018 6.3.1.3 3,转换由实现定义(将不可表示的值转换为有符号整数类型时)。编译器通常会对类型(256)中可表示的值的数量进行模包装,但C标准并不保证这一点。正确地说,您的定义应该是
int8\t small\u int=-128
int8\u t small\u int=-0x80
int8\u t
是2的补码类型,因此其中的10000000位表示−128

对于
uint16_t
,比
uint16_t
中可以表示的最大值多出一个值,即比65535(十六进制FFFF)多出一个值,即65536(十六进制10000)

−128加65536等于65408,十六进制为FF80


不过,备份时,您的第一个声明中有一个问题:
int8\t small\u int=0x80
int8\u t
可以表示−128至+127。但是
0x80
表示值128。它不合适。当它用于初始化
int8\t
时,将执行转换。根据C 2018 6.3.1.3 3,转换由实现定义(将不可表示的值转换为有符号整数类型时)。编译器通常会对类型(256)中可表示的值的数量进行模包装,但C标准并不保证这一点。正确地说,您的定义应该是
int8\t small\u int=-128
int8\u t small\u int=-0x80

谢谢你的啃咬者。应该意识到“值”是-128,而不是0x80=+128。谢谢gnasher。应该意识到“值”是-128,而不是0x80=+128。
uint16_t big_uint = (uint16_t)((int16_t)small_int);