基本整数赋值

Rad*_*row 14 c

这是让我感到沮丧的原因:

我们有两个整数:一个是类型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实际上是负面的.