3

当您在 C 中将 int 分配给 char 时会发生什么?它总是忽略左边的多余位吗?

示例(4 字节 int):

unsigned char c = 0;
unsigned int i = 500;

c = i; // c is 244

c = i << 24 >> 24; //c is 244

i = i << 24 >> 24; //i is 244

在二进制中,500is111110100244is 11110100

4

1 回答 1

8

通常,这正是发生的情况。ISO/IEC 9899:2011 标准的第 6.3.1.3 节规定了在这种情况下必须发生的事情:

6.3.1.3 有符号和无符号整数

  1. 当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则保持不变。
  2. 否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。60)
  3. 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

60)规则描述的是数学值的算术,而不是给定类型表达式的值。

您的情况属于上述第 2 项(因为您的角色被声明为未签名)。在典型的计算机算术中,结果将与您描述的完全相同。

于 2013-08-17T23:54:51.033 回答