在C语言中,从int类型赋值给char类型是如何工作的?

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

在二进制中,500111110100,而 244 则是 11110100

@WhozCraig 无符号整数溢出被定义为(它将溢出的值模UINT_MAX + 1)。 - user529758
@H2CO3 你说得对。无符号数不会溢出(考虑到我写了这个答案,我应该非常清楚)。 - WhozCraig
@WhozCraig 不用担心... 有一次我因为某种脑残的原因错误地说出,在编译Objective-C时不需要类型信息来生成代码。尽管我在几分钟内纠正了自己,但仍有些人坚称我不知道自己在说什么...无论如何。 - user529758
1个回答

8
通常情况下,会按照ISO/IEC 9899:2011标准6.3.1.3节的规定进行处理:
6.3.1.3有符号和无符号整数
1. 将整型值转换为另一种整数类型(不是_Bool),如果该值可以用新类型表示,则保持不变。 2. 否则,如果新类型是无符号类型,则通过重复添加或减去可以在新类型中表示的最大值加1,直到该值在新类型的范围内,进行转换。 3. 否则,新类型是有符号的,且该值无法表示在其中;结果要么是实现定义的,要么是实现定义的信号被触发。
上述情况属于第2点(因为字符被声明为无符号)。在典型的计算机算术中,结果将完全按照您所描述的那样。

+1 这是正确的。在我的一时糊涂中,我对#3有些恍惚,这只是在一般评论中。 (今天只是那种日子) - WhozCraig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接