将负int值存储在无符号位中并从中减去

时间:2014-10-28 13:03:56

标签: c int unsigned negative-number

首先,我一直在寻找无符号整数中负输入的结果,但无法找出它是如何转换的。例如-3。 -3怎么样,怎么样呢?

从中减去怎么样?

会发生什么?

#include <stdio.h> 

int main(){ 
unsigned int num1 = 3, num2 = -2; 

printf("num1's initial value is %u.\n",num1); 
printf("num2's initial value is %u.\n",num2); 

num1 = num1 + 1; 
num2 = num2 - 1; 

printf("num1's value is now %u.\n",num1); 
printf("num2's value is now %u.\n",num2); 

num1 = 2147483647; 
num2 = -2147483648; 

printf("num1's value is now %u.\n",num1); 
printf("num2's value is now %u.\n",num2); 

num1 = num1 + 1; 
num2 = num2 - 1; 

printf("num1's value is now %u.\n",num1); 
printf("num2's value is now %u.\n",num2);

return 0;
}

2 个答案:

答案 0 :(得分:0)

分配负数与分配0并减去该数字相同。当这个减法发生时,你的数字会溢出并变得巨大;

如果x是你可以存储的更大的数字,x + 1 = 0(溢出并在循环中转移),这意味着当你在无符号数字中执行0 - 1时,你实际上得到的是最大数字你可以存储。

只有当您减去0或超出最大数量时,事物的行为才会有所不同。之后,这些数字将与其他数字一样。

答案 1 :(得分:0)

好的,我们一行一行..

1。 unsigned int num1 = 3, num2 = -2;

表示num2 = -2 ;它将显示为值的正整数 max unsigned integer - 1(值取决于计算机体系结构和编译器)。

就像你指定num2 = X(比如),存储的值是MAX_UNSIGNED_VALUE - (X-1)。

基本上它会将表示-X(以2的补码)的位模式分配给unsigned int。这将是一个很大的无符号值。对于32位整数,这将是2 ^ 32 - (X + 1)。

接下来的行

num2 = -2147483648;

所以我考虑32位int它将存储(unsigned int的最大值 - 2147483647)。

num2 =(4294967295-2147483647)= 2147483648

在以下文章中给出了关于如何发生这种转换的非常详细的解释。

希望这有帮助!