为什么`char`数据类型中的数据溢出会导致将值包装在其范围内?

卢卡斯

我最近遇到了这个问题,以及@chux-Reinstate Monica给出的答案

在他的回答中引述以下行:“这是实现定义的行为。分配的值可能是0或1或2 ...通常,通过将值加/减256直到在范围内,将值包装(“修改”)100 + 100 -256 --> -56。 ”

码:

#include <stdio.h>
int main(void)
{
 char a = 127;
 a++;
 printf("%d", a);
 return 0;
}

输出: -128


在大多数C编译器中,chartype占用1 Byte大小,严格来说,我假设其为16位系统,并且chartake 1 Byte

a = 127,其在计算机内部的二进制表示为时,将其0111 1111增加1应得出该值

0111 1111 + 0000 0001 = 1000 0000

等于-0(考虑到,带符号的数字表示,其中最左边的位表示0 = + and 1 = -),那么为什么输出等于-128

是因为“ INTELGER PROMOTION RULE”吗?我的意思是,对于此表达式a + 1操作之前将a转换为,然后其在内存中的二进制表示形式就等于输出并且对输出有意义但是,后来我的这种假设与Chux-Reinstate-Monica的有关包装值的引用行发生冲突int (2 Bytes)+1111 1111 1000 0000-128-128

1000 0000等于-0 ...

二进制补码为-0,但大多数计算机使用不是二进制补码

二进制补码表示法,最左边的位表示,-(coefficient_bit * 2^N-1)即您的情况,1000 0000最左边的位表示-(1 * 2^8-1)等于-128,这就是为什么输出相同的原因。

char是一个8位有符号整数,在这种情况下1000 0000是-128。我们可以使用允许二进制常量GNU扩展方便地测试1000 0000

char a = 0b10000000;
printf("%d\n", a);    // -128

char在此实现中,是一个带符号的8位整数。将1加到127会导致整数溢出到-128。

整数促销呢?计算过程会发生整数提升,但结果仍为char128无法容纳在我们签名的8位字符中,因此溢出到-128。

此示例演示了整数提升

char a = 30, b = 40;
char c = (a * b);
printf("%d\n", c);      // -80

char d = (a * b) / 10;
printf("%d\n", d);      // 120

char c = (a * b);是-80,但是char d = (a * b) / 10;120。为什么?不应该是-8吗?答案整数提升。数学运算是作为本机整数完成的,但结果仍必须填充为8位char。(30 * 40)是1200,即0100 10110000。然后必须将其填充回8位带符号整数;那是1011 0000或-80。

对于其他计算,(30 * 40) / 10== 1200 / 10== 120非常合适。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能更改类型结构范围内的值?

将datetime2数据类型转换为datetime数据类型会导致超出范围的值

用户断开云端硬盘中的应用的连接会导致FILE范围内的数据丢失

Laravel与SQL Server 2008抛出“将varchar数据类型转换为日期时间数据类型导致值超出范围”

为什么将数据类型添加为类型声明的约束会导致匹配错误而不是更正确的错误?

R:检查数据框的值是否在其他数据框的范围内

Haskell错误:定义代数数据类型时,类型变量不在范围内

为什么通配符类型参数不在自引用类型的包装器范围内

为什么iife中的包装函数会导致弱类型?

数据类型转换导致R中的NULL值

即使没有datetime列,也得到“将varchar数据类型转换为datetime数据类型导致超出范围的值”

为什么在C#中将字节值分配给动态变量会导致动态更改为字节数据类型?

为什么Hadoop中的“自定义数据类型”发生溢出故障

从nvarchar数据类型到datetime数据类型的转换导致C#中的值超出范围

为什么此查询在某些数据范围内速度较慢而在其他数据范围内速度较快?

如何解决将datetime2数据类型转换为datetime数据类型导致值超出范围

varchar数据类型到datetime数据类型的转换导致超出范围的值MVC5中的错误

错误“将 varchar 数据类型转换为日期时间数据类型导致值超出范围。” 而存储日期格式是 dd-mm-yyyy

将 varchar 数据类型转换为 datetime 数据类型导致 c# 中的值超出范围

ASP.NET MVC:将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。该语句已终止

日期时间转换错误 - 将 varchar 数据类型转换为日期时间数据类型导致值超出范围

为什么数据类型会变成“逻辑”?电阻

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围异常

为什么 00000000 - 00000001 = 11111111 在 C unsigned char 数据类型中?

为什么数据类型会冲突?

当提供的值在其限制范围内时,字节数据类型溢出错误

Azure MSSQL - 将 nvarchar 数据类型转换为日期时间数据类型导致值超出范围

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围