【问题标题】:How assignment from int to char works in C?从 int 到 char 的赋值如何在 C 中工作?
【发布时间】:2013-08-17 23:42:48
【问题描述】:

在 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

在二进制中,500 是 111110100,244 是 11110100。

【问题讨论】:

  • @WhozCraig 定义了无符号整数溢出(它采用溢出值模UINT_MAX + 1)。
  • @H2CO3 你是对的。 unsigned 不能溢出(考虑到我写了this answer,我应该很清楚这一点)。
  • @WhozCraig 不用担心......一旦我错误地声明(无论出于何种脑死原因)编译 Objective-C 时代码生成不需要类型信息。尽管我在几分钟内就纠正了自己,但有些人仍然坚持说我不知道​​我在说什么……随便。

标签: c binary bit-manipulation


【解决方案1】:

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

6.3.1.3 有符号和无符号整数

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

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

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

【讨论】:

  • +1 这是正确的。在我的一般评论中,我暂时失去理智时,我正在疏远#3。 (刚刚度过了那些天)
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 2020-12-10
  • 2015-09-07
  • 1970-01-01
  • 2012-12-29
  • 2014-09-12
  • 2011-05-02
  • 2020-07-16
相关资源
最近更新 更多