C、 小整数到大整数的转换
当从较小的int(负值)转换为较大的uint时,该值应该是什么? 例如: 我期待0x80,来自C标准,如下所示: 0x80+0xFFFF=0x0079, 然后加1得到0x0080 但我的模拟器给出的大单位结果是0xFF80。 我试了8=>16、16=>32和32=>64次。所有结果都相同(即符号扩展) 这是因为编译器实际执行以下操作: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
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);