首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >16位2位补码中的负误差

16位2位补码中的负误差
EN

Stack Overflow用户
提问于 2020-07-16 13:36:29
回答 2查看 116关注 0票数 0

它是寻找2的补码的代码。当numchar时,它可以工作8位。但是当16位数是unsigned int时。密码不起作用。

你能指路吗?

代码语言:javascript
运行
复制
#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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-16 14:41:41

在大多数计算机上,unsigned int是一个32位变量.如果您想使用16位值,请使用uint16_t按首选项,或使用unsigned short。您还需要在printf调用中使用适当的半字说明符:

代码语言:javascript
运行
复制
#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;
}

这输出

代码语言:javascript
运行
复制
1's = 0, 2's = 1 
票数 0
EN

Stack Overflow用户

发布于 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位宽的,所以行:

代码语言:javascript
运行
复制
#define ISNEGATIVE(num)     num & 0x80 

应:

代码语言:javascript
运行
复制
#define ISNEGATIVE(num)     num & 0x8000

同样重要的是,由于存储在unsigned类型的MSB中的值不会使值为负值,因此该算法只应用于计算signed类型。

代码语言:javascript
运行
复制
unsigned int num;

应:

代码语言:javascript
运行
复制
int num;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62936022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档