我有一个非常基本的查询。 对于以下代码:
int i = -1;
unsigned int j = (unsigned int) i;
printf("%d",j); // I get 65535 the int limit in turbo C 16 bit compiler
它不应该简单地放下负号或者它是否包围了极限?
答案 0 :(得分:6)
最常用于表示负数的方案称为Two's Complement。在此方案中,-1
具有所有1
位的位模式:1111 1111 1111 1111
。当解释为无符号整数时,这就是你的演员意味着什么,那就是65535。
换句话说,它只是“简单地删除负号”,除非这样做会产生与预期不同的效果。
答案 1 :(得分:1)
将int
转换为unsigned int
时,如果该值为负,则结果就好像该负值已添加到大于unsigned int
可容纳的数字1。这是自C90以来的C标准规定,无论机器是使用二进制补码,一个补码还是带符号幅度表示,都可以保持不变。