如果为char分配的值太大而无法放入字节,会发生什么?

use*_*549 4 c integer-overflow char

假设我有一个char指针:

    char * cp;
    int val2 = 2;
    cp = &val2;
    *cp = 1234;
Run Code Online (Sandbox Code Playgroud)

由于值1234太大而无法容纳1个字节会发生什么?它会溢出并导致存储不正确的值,还是会以某种方式将正确的值存储在几个字节中?

Eri*_*hil 9

In *cp = 1234;,*cp仅指一个字节,即第一个(最低寻址)字节val2.

在赋值中,右侧的值将转换为左侧的类型.所以,1234将被转换为char.

这里有两个复杂的问题.其中一个,在大多数C实现中,1234太大而无法适应char.(C标准允许a char大于8位,但这在现代计算机中很少见.)二,char可以是有符号或无符号的.

如果char是无符号的,那么转换很明确:1234的模数减去模数比最大值char(通常为255,因此减少模数为256).在通常情况下,1234将减少到210,并且这将存储在所引用的字节中*cp.

如果char已签名且1234不适合a char,则转换是实现定义的,或者引发实现定义的信号.在许多现代C实现中,转换的结果将是-46.

cp指向的字节cp = &val2;是最低位的字节val2.它不一定是最不重要的字节val2.一些C实现存储内存中最低有效字节最小的整数(小端),而一些C实现存储内存中最高有效字节最低的整数(大端).(甚至有些系统不按顺序存储字节;它们可能在内存中混淆.)

大多数现代C实现以二进制补码的形式存储整数而没有填充,因此,一旦你知道C实现是big-endian还是little-endian,你就会知道改变一个字节会如何影响它的值int.但是,C标准仍然允许符号或数字补码.它还允许有符号整数中的填充位.

最后,请注意,这char是一种特殊类型,允许以这种方式访问​​其他对象的一部分.如果,例如,您使用short的,而不是char作为,short *sp = &val2; *sp = 0;,这将是一个违反的别名规则和行为将是不确定的.