gpt4 book ai didi

c - 如何将二进制数转换为有符号十进制数

转载 作者:行者123 更新时间:2023-11-30 21:05:01 25 4
gpt4 key购买 nike

假设我有这个二进制数“1011”,我想将其转换为有符号十进制,因此它是“-3”而不是“11”。我该怎么做,我 C.

最佳答案

十进制、二进制、十六进制、八进制……只是字符串表示形式的问题;无论我们使用什么基数,整数值(例如存储在 int 变量中)都保持不变。

例如

int a=33;   // understood as decimal representation by the compiler
int b=0x21; // understood as hexadecimal representation by the compiler
int c=041; // understood as octal representation by the compiler
int d='!'; // understood as ASCII representation by the compiler
if((a==b)&&(a==c)&&(a==d))
{
printf("this condition is always true!\n");
}

然后,我们可以从问题中假设 "1011" 是以 2 为基数表示的 4 位有符号整数的字符串表示形式,并且我们希望生成另一个包含该表示形式的字符串相同的值以 10 为基数表示。

假设我们依赖广泛使用的two's complement表示,这是一个逐步示例(可能存在一些更有效的方法来完成同样的事情)。

#include <stdio.h>
#include <string.h>
#include <assert.h>

int
read_bin_value(const char *bin_str)
{
unsigned int result=0;
const int bin_len=8*(int)sizeof(result);
const int str_len=(int)strlen(bin_str);
assert(str_len&&(str_len<=bin_len));
// extract bits from bin_str
for(int i=0; i<str_len; ++i)
{
const unsigned int bit=(bin_str[i]!='0'); // assume '1' if not '0'
result|=(bit<<(str_len-1-i)); // place bit
}
// extend sign bit
const unsigned int sign_bit=(bin_str[0]!='0');
for(int i=str_len; i<bin_len; ++i)
{
result|=(sign_bit<<i);
}
// interpret as signed value
return (int)result;
}

int
main(void)
{
const char *bin_str[]={"1011", "0011", "0", "1", "01", NULL};
for(int i=0; bin_str[i]; ++i)
{
char dec_str[20];
snprintf(dec_str, sizeof(dec_str), "%d", read_bin_value(bin_str[i]));
printf("%s --> %s\n", bin_str[i], dec_str);
}
return 0;
}

请注意,根据二进制补码,-3(基数为 10)的二进制表示形式不是“1011”(我猜您认为有符号整数只是带有符号位的无符号整数) ,但事实并非如此)。

关于c - 如何将二进制数转换为有符号十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57230030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com