Tag: 二进制补码

无符号幅度和二进制补码

我已经编写了一个代码来计算给定二进制代码的无符号幅度和二进制补码,除了我没有得到我应该的值。 我不确定我的代码究竟出了什么问题。 我希望不要在我的代码中使用幂函数和乘法函数。 我在下面发布了我的代码,请让我知道为什么我得到的值不正确。 #include “stdio.h” #define MAX_BITS 32 #define ENTER ‘\n’ #define NUMBER_TWO 2 int main() { int unsignedMag; int twosComp; int negation[MAX_BITS]; int bitStore[MAX_BITS]; char enter; int count; //Input from the User printf(“Enter up to 32 bits (hit ‘enter’ to terminate early): “); //Reads the first bit as a character char bit = […]

签名hex字符串到long int函数

我需要一个函数将32位或24位带符号(二进制补码)hex字符串转换为long int。 需要在32位和64位机器上工作(无论长度大小如何),无论机器是否是双补机,都需要工作。 解: long int hex2li (char hexStr[], int signedHex) { int bits = strlen (hexStr) * 4; char *pEnd; long long int result = strtoll (hexStr, &pEnd, 16); if (pEnd[0] == ‘\0’) { if (signedHex) { if (result >= (1LL << (bits – 1))) result -= (1LL << bits); } return (long int) […]

14位左对齐的二进制补码

我有两个字节包含一个14位左对齐的二进制补码值,我需要将它转换为有符号的短值(范围从-8192到+8191,我猜?) 最快的方法是什么?

结构变量不会因赋值而改变

struct st { int a1 : 3; int a2 : 2; int a3 : 1; } void main(void) { x.a3 = -1; if (x.a3 == -1) printf(“TRUE\n”); else printf(“FALSE\n”); x.a3 = 1; if (x.a3 == 1) printf(“TRUE\n”); else printf(“FALSE\n”); } 如果是‘x.a3 = -1;’ 首先,如果是真 。 但是,为什么‘x.a3 = 1’在第二个没有变化? 它仍然是x.a3 = -1。 和 如果我输入‘x.a3 = 1;’ […]

查找仅使用按位函数表示2的补码所需的位数

我们可以假设一个int是2位恭维中的32位唯一合法的运算符是:! 〜&^ | + <> 此时我正在使用蛮力 int a=0x01; x=(x+1)>>1; //(have tried with just x instead of x+1 as well) a = a+(!(!x)); …最后2个语句重复32次。 每增加1次,x移位一位,!= 0,全部32位 使用测试编译器,它说我的方法在测试用例0x7FFFFFFF(0后跟31 1)上失败,并说这个数字需要32位来表示。 我不明白为什么这不是31(我的方法计算)谁能解释为什么? 我需要改变什么来解释这个?

为什么我们在C中有无符号和有符号的int类型?

我是C的初学者。 我最近了解了2’s Complement和其他表示负数的方法以及为什么2’s complement是最合适的。 我想问的是,例如, int a = -3; unsigned int b = -3; //This is the interesting Part. 现在,用于转换int类型 标准说: 6.3.1.3有符号和无符号整数 当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变。 否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 第一段不能用作-3不能用unsigned int表示。 因此第2段开始发挥作用,我们需要知道unsigned int的最大值。 它可以在limits.h中找到UINT_MAX 。 这种情况下的最大值是4294967295因此计算结果如下: -3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293 现在4294967293二进制是11111111 11111111 11111111 11111101和-3 in 2的补码forms是11111111 11111111 11111111 11111101所以它们基本上是相同的位表示,无论我想要分配给无符号整数的负整数,它总是相同的。所以不是无符号类型冗余。 现在我知道printf(“%d” , […]

程序员视角教科书中的无符号/有符号算术问题

int x = random(); int y = random(); unsigned ux = (unsigned) x; unsigned uy = (unsigned) y; 对于以下每个C表达式,您要指出表达式是否总是产生1.如果它总是得到1,则描述基础数学原理。 否则,举一个让它产生0的参数的例子。 A. (x-y) B. ((x+y)<> 2) << 2) <= x 对于这些问题,我认为只有A可以产生0,而其余的总是产生1。 我知道这可能是错的,我不是在寻找直接的答案,但我希望得到一些关于如何处理这些问题的一般知识/建议。 我有一个非常糟糕的教授,我一直在努力寻找在线资源,但我真的不知道从哪里开始或寻找什么。 我知道无符号/二进制补码算术和位移的基础知识,但我不知道如何应用它来查找这些问题的计数器情况。

仅使用按位运算符执行二进制算术运算

可能重复: 如何仅使用位移和加法进行乘法和除法? 我必须编写函数来执行二进制减法,乘法和除法,而不使用除循环控制之外的任何算术运算符。 我之前只用Java编写代码,所以我很难绕过这个问题。 从减法开始,我需要用原型编写一个函数 int bsub(int x, int y) 我知道我需要将y转换为二的补码以使其为负并将其添加到x,但我只知道如何通过使用一个补码运算符并添加1来实现这一点,但我不能使用+运算符。 提供了badd函数,如果我能弄清楚如何制作负数,我将能够在bsub中实现它。 badd的代码如下所示。 提前感谢任何提示。 int badd(int x,int y){ int i; char sum; char car_in=0; char car_out; char a,b; unsigned int mask=0x00000001; int result=0; for(i=0;i<32;i++){ a=(x&mask)!=0; b=(y&mask)!=0; car_out=car_in & (a|b) |a&b; sum=a^b^car_in; if(sum) { result|=mask; } if(i!=31) { car_in=car_out; } else { if(car_in!=car_out) { printf("Overflow occurred\n"); […]

为什么在签名的二进制补码表示中-INT_MIN = INT_MIN?

我还没有找到最低签名负数没有等效签名正数的原因? 我的意思是在3位二进制数字中为简单起见100是-4? 但是我们不能以签名格式获得积极的4,因为我们不能。 它溢出了。 那么我们怎么知道两个补码1000是-4 1000 0000是-128等等? 我们没有原始正数