[英]What happens when a char is assigned a value too large to fit in a byte?
假设我有一个char指针:
char * cp;
int val2 = 2;
cp = &val2;
*cp = 1234;
由于值1234太大而无法容纳1个字节会发生什么? 它会溢出并导致存储不正确的值,还是会以某种方式将正确的值存储在几个字节中?
在*cp = 1234;
, *cp
仅指一个字节,即val2
的第一个(最低寻址)字节。
在赋值中,右侧的值将转换为左侧的类型。 因此,1234将转换为char
。
这里有两个复杂的问题。 一,在大多数C实现中,1234太大而不适合char
。 (C标准允许char
大于8位,但这在现代计算机中很少见。)2, char
可以是有符号或无符号的。
如果char
是无符号的,那么转换很明确:1234比char
的最大值模数减少一个(通常为255,因此减少模数为256)。 在通常情况下,1234将减少到210,并且这将存储在*cp
引用的字节中。
如果char
已签名且1234不适合char
,则转换是实现定义的,或者引发实现定义的信号。 在许多现代C实现中,转换的结果将是-46。
cp
指向cp = &val2;
之后的字节cp = &val2;
是val2
的最低地址字节。 它不一定是val2
的最低有效字节。 一些C实现存储内存中最低有效字节最小的整数( 小端 ),而一些C实现存储内存中最高有效字节最低的整数( 大端 )。 (甚至有些系统不按顺序存储字节;它们可能在内存中混淆。)
大多数现代C实现以二进制形式存储整数而没有填充,因此,一旦你知道C实现是big-endian还是little-endian,你就会知道改变一个字节会如何影响int
的值。 但是,C标准仍然允许符号或数字补码。 它还允许有符号整数中的填充位。
最后,请注意char
是一种特殊类型,它允许以这种方式访问其他对象的一部分。 例如,如果你使用short
而不是char
,就像short *sp = &val2; *sp = 0;
short *sp = &val2; *sp = 0;
,这将违反别名规则,并且行为将是未定义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.