gpt4 book ai didi

c - 当为 char 分配的值太大而无法容纳一个字节时会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 15:19:51 24 4
gpt4 key购买 nike

假设我有一个字符指针:

    char * cp;
int val2 = 2;
cp = &val2;
*cp = 1234;

由于值 1234 太大而不适合 1 个字节,会发生什么情况?它会溢出并导致存储不正确的值,还是会以某种方式跨多个字节存储正确的值?

最佳答案

*cp = 1234; 中,*cp 仅指一个字节,即 val2 的第一个(最低地址)字节。

在赋值中,右侧的值被转换为左侧的类型。因此,1234 将被转换为 char

这里有两个问题。第一,在大多数 C 实现中,1234 太大而无法放入 char。 (C 标准允许 char 大于八位,但这在现代计算机中很少见。)二,char 可以是有符号的或无符号的。

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

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

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

大多数现代 C 实现以不填充的补码形式存储整数,因此,一旦您知道 C 实现是大端还是小端,您就会知道改变一个字节将如何影响 的值整数。但是,C 标准仍然允许符号和大小或个的补码。它还允许在有符号整数中填充位。

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

关于c - 当为 char 分配的值太大而无法容纳一个字节时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21667971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com