- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有一个字符指针:
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/
我目前正在开发一个业务应用程序,最终将由 .Net 托管公司托管。托管公司提供 1 个 MSSQL DB(2 个用户)和无限数量的 MySQL DB。购买第二个 MSSQL DB 是不可能的,因为我的
我是一名优秀的程序员,十分优秀!