1第一:类型转换对生成的代码没有影响。编译器非常清楚目标是一个 char 变量,因此必须将值转换为 char。类型转换只是将隐式转换变为显式转换,而不改变行为。许多编译器会对隐式缩小转换发出警告(因为您可能会意外损失精度),而对于显式转换则保持沉默(因为您明确要求损失精度)。第二:关于未定义的事实,在 C11 的最终草案方面,我的说法实际上是错误的。 - Michael Karcher
1C11最终草案的6.3.1.3节规定,在这种情况下,行为是一个实现定义的值(“算法”必须有文件记录并保持一致),或者导致实现定义的信号。这与C99没有改变(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)。 - Michael Karcher
所以它是已定义还是未定义的? - Xiobiq
1使用强制类型转换或不使用强制类型转换是“实现定义”的。因此,标准兼容的C编译器的作者必须记录在这种情况下会发生什么,并且必须始终遵循该文档。例如,对于gcc,请查看此处:https://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Integers-implementation.html。他们明确指出,有符号变量中的值与原始存储值之间的差异是2 ^ N的倍数,其中N是目标变量中的位数。这就是他们所说的“模2 ^ N减少”。 - Michael Karcher
p
与num
毫无关系,而是一个未显示的值i
。打错字了吗? - Edward Thomson