繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM