这是让我感到沮丧的原因:
我们有两个整数:一个是类型int16_t,另一个是int8_t.我已将这两个变量初始化如下:
int8_t short_int = 250 //This equals -6, and its binary representation is 0b1111 1010
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
int16_t my_int = short_int //as we already know short_int is 0b1111 1010
Run Code Online (Sandbox Code Playgroud)
对我来说,my_int应该等于0b1111 1010对吧?作为16位整数,值0b1111 1010的十进制表示为250.好的,但它没有.
打印my_int I的值获得-6其在二进制表示为0b1111 1111 1111 1010 完全不同的从short_int作为二进制.
M.M*_*M.M 15
int8_t short_int = 250导致实现定义的行为.范围int8_t是-128通过127.
显然,您的实现会-6为此生成值short_int.好到目前为止.
但现在你必须记住C有保值转换.如果转换-6为任何其他有符号整数类型,它仍将是-6,无论其位表示是什么.
有些人会谈论"符号扩展"和其他类似的东西,但要理解C的工作方式,你只需要记住,除非超出类型的范围,否则保留值; 在这种情况下,它被截断(对于无符号类型)或实现定义的行为(对于有符号类型;通常是2的补码截断).
und*_*gor 13
C基于值而不是位模式工作.
如果分配int8_t到的int16_t,都具有相同的价值之后.
对于负值,这意味着它们具有不同的位模式(假设负值的公共表示).
请注意,您int8_t实际上是负面的.