题
我有一个非常基本的查询。对于下面的代码:
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。
换句话说,它确实"简单地放下负号",除了这样做具有与您期望的不同的效果。
其他提示
当转换 int
到 unsigned int
, ,如果该值是负的结果是,如果该负值已被添加到数字1大于什么 unsigned int
能撑住。这是由c标准自C90以来指定的,并且无论机器使用二的补码,一的补码还是带符号的幅度表示都成立。
不隶属于 StackOverflow