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

示例(4 字节整数):

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

在二进制中, 50011111010024411110100

最佳答案

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

6.3.1.3 有符号和无符号整数

  • 当一个整数类型的值转换为另一个整数时
    _Bool 以外的类型,如果该值可以由新的表示
    类型,不变。
  • 否则,如果新类型是无符号的,则该值被转换为
    重复加减一比最大值
    可以用新类型表示,直到值在
    新类型的范围。60)
  • 否则,新类型有符号,值不能为
    在其中代表;结果要么是实现定义的,要么
    引发了一个实现定义的信号。

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

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

    关于c - 从 int 到 char 的赋值如何在 C 中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18294350/

    10-11 02:10