C类型转换:按位或算术

C类型转换:按位或算术,c,C,我想知道类型转换在类型之间是如何工作的(在“嵌入式”C中)。例如:如果我有一个值为-80d,11010000b的有符号16位数字,我想将其转换为无符号16位。我得到哪个值,是80d,还是208 我的意思是,转换是按位还是算术?只是位的解释改变了,还是转换真的改变了位 如果它真的改变了位,我该怎么做呢?解释改变了。例如,当我从i2c设备读取u8值时,我必须将位解释为有符号值 最后,实际上和上面一样:如果它不改变位,我如何转换它,使它改变位而不是值 亲切问候,, Jesse无论何时进行强制转换,都会

我想知道类型转换在类型之间是如何工作的(在“嵌入式”C中)。例如:如果我有一个值为
-80d
11010000b
有符号16位
数字,我想将其转换为
无符号16位
。我得到哪个值,是80d,还是208

我的意思是,转换是按位还是算术?只是位的解释改变了,还是转换真的改变了位

如果它真的改变了位,我该怎么做呢?解释改变了。例如,当我从i2c设备读取u8值时,我必须将位解释为有符号值

最后,实际上和上面一样:如果它不改变位,我如何转换它,使它改变位而不是值

亲切问候,,
Jesse

无论何时进行强制转换,都会触发类型转换,这由C11 6.3.1.3指定:

6.3.1.3有符号和无符号整数

当整数类型的值转换为除_Bool以外的其他整数类型时,如果 该值可以由新类型表示,但保持不变

否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内。60)

否则,新类型已签名,且无法在其中表示值;要么 结果是定义了实现或发出了定义了实现的信号

第二段介绍了从有符号到无符号的转换过程。它是以这种奇怪的方式编写的,涵盖了所有形式的签名格式。实际上,在16位2的补码系统中,它意味着从
-80d
(十六进制
FFB0h
)到值
FFB0h
,即无符号数
65456d


它不会改变任何位。

无论何时进行转换,都会触发C11 6.3.1.3指定的类型转换:

6.3.1.3有符号和无符号整数

当整数类型的值转换为除_Bool以外的其他整数类型时,如果 该值可以由新类型表示,但保持不变

否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内。60)

否则,新类型已签名,且无法在其中表示值;要么 结果是定义了实现或发出了定义了实现的信号

第二段介绍了从有符号到无符号的转换过程。它是以这种奇怪的方式编写的,涵盖了所有形式的签名格式。实际上,在16位2的补码系统中,它意味着从
-80d
(十六进制
FFB0h
)到值
FFB0h
,即无符号数
65456d


它不改变任何位。

这在C标准中得到了精确定义-80不是
11010000
,而是
11111111010000
。有16位,数字是。这在C标准中有精确的定义-80不是
11010000
,而是
11111111010000
。有16位,数字是。再一次,它不会改变2的补码系统中的任何位,其他的不是真的相关的。结果总是
0xFFB0
,无论是2还是1或符号+幅度系统,但位在1或符号+幅度系统中自然会发生变化。@AnttiHaapala实际上对所有符号格式都是一样的,因为新类型是无符号的,之后符号不适用-80+65536给出65456,无论签名格式如何。位不会改变,因为无符号16在所有允许的系统上都有相同的表示。是的,我的意思是,在2的补码中,有符号表示也有相同的位集,因为OP显然有一个2的补码系统,所以整个讨论不是很相关。此外,将话题转移到关于罕见和奇异符号格式的讨论中并不会帮助任何初学者(如果有的话),只会让他们更加困惑。同样,它不会改变2的补码系统的任何部分,也不会改变其他部分的相关性。结果总是
0xFFB0
,无论是2还是1或符号+幅度系统,但位在1或符号+幅度系统中自然会发生变化。@AnttiHaapala实际上对所有符号格式都是一样的,因为新类型是无符号的,之后符号不适用-80+65536给出65456,无论签名格式如何。位不会改变,因为无符号16在所有允许的系统上都有相同的表示。是的,我的意思是,在2的补码中,有符号表示也有相同的位集,因为OP显然有一个2的补码系统,所以整个讨论不是很相关。此外,将话题转移到关于罕见和奇异符号格式的讨论中,对任何初学者(如果有的话)都没有帮助,只会让他们更加困惑。