它是寻找2的补码的代码。当num是char时,它可以工作8位。但是当16位数是unsigned int时。密码不起作用。
你能指路吗?
#include<stdio.h>
#define ISNEGATIVE(num) num & 0x80
#define TWO_COMP(num) (~num) + 1
int main()
{
unsigned int num;
num = 0xFFFF;
if(ISNEGATIVE(num))
printf("1's = %d, 2's = %d", ~num, TWO_COMP(num));
return 0;
}产出:
1= -65536,2's = -65535
发布于 2020-07-16 14:41:41
在大多数计算机上,unsigned int是一个32位变量.如果您想使用16位值,请使用uint16_t按首选项,或使用unsigned short。您还需要在printf调用中使用适当的半字说明符:
#include <stdio.h>
#include <stdint.h>
#define ISNEGATIVE(num) num & 0x8000
#define TWO_COMP(num) (~num) + 1
int main()
{
/*unsigned short num;*/
uint16_t num;
num = 0xFFFF;
if(ISNEGATIVE(num))
printf("1's = %hd, 2's = %hd", ~num, TWO_COMP(num));
return 0;
}这输出
1's = 0, 2's = 1 发布于 2020-07-16 14:04:44
这两个主要问题是:
signed类型,char AKA int8_t的宽度为8位,因此0x80工作得很好。
short int AKA int16_t的宽度为16位,因此需要0x8000
int AKA int32_t的宽度为32位,因此需要0x80000000
等等..。
因为代码中的num是16位宽的,所以行:
#define ISNEGATIVE(num) num & 0x80 应:
#define ISNEGATIVE(num) num & 0x8000同样重要的是,由于存储在unsigned类型的MSB中的值不会使值为负值,因此该算法只应用于计算signed类型。
unsigned int num;应:
int num;https://stackoverflow.com/questions/62936022
复制相似问题