我有一个非常基本的查询。对于下面的代码:

int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler

它不应该简单地删除负号还是环绕限制?

有帮助吗?

解决方案

最常用于表示负数的方案称为 二的补码.在这个方案 -1 具有所有的位模式 1 比特: 1111 1111 1111 1111.当被解释为无符号整数时,这就是你的强制转换的意思,那就是65535。

换句话说,它确实"简单地放下负号",除了这样做具有与您期望的不同的效果。

其他提示

当转换 intunsigned int, ,如果该值是负的结果是,如果该负值已被添加到数字1大于什么 unsigned int 能撑住。这是由c标准自C90以来指定的,并且无论机器使用二的补码,一的补码还是带符号的幅度表示都成立。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top