精华内容
下载资源
问答
  • C语言无符号数与有符号数的运算原则,一些容易踩坑的点
    int main(void)
    {
    	for (int i = -1; i < sizeof(int); i++) {
    		printf("%d\n", i);
    	}
    	return 0;
    }
    

    啥都不输出,因为:

    1、sizeof()返回的是unsigned int类型

    2、有符号数与无符号数进行运算时,有符号数先自动转换成无符号数

    因此"i < sizeof(int)"比较时-1会转换成unsigned int类型,溢出到unsigned int的最大值,导致大于sizeof(int)
     

    int main(void)
    {
    	unsigned int a = 6;
    	int b = -20;
    	int c = a + b;
    	printf("b = %u\n", b); // b = 4294967276
    	printf("a + b = %u\n", a + b); // a + b = 4294967282
    	printf("a + b = %d\n", a + b); // a + b = -14
    
    	if ((a + b) > 0) {
    		printf("a + b > 0\n"); // a + b > 0
    	} else {
    		printf("a + b <= 0\n");
    	}
    	
    	if (c > 0) {
    		printf("c > 0\n");
    	} else {
    		printf("c <= 0\n"); // c <= 0
    	}
    	return 0;
    }
    

    1、a+b,b要转为无符号,即4294967276,可以理解为无符号下-20,

    再加a就是4294967282,即ffff fff2,可以理解为无符号下-14,因此输出回%d有符号十进制就是-14

    2、a+b的值是ffff fff2,肯定大于0,所以输出a + b > 0

    3、c是int类型有符号整数,所以同%d输出一样,无符号下-14值转有符号十进制是-14,所以c小于0
     

    int main(void)
    {
    	signed short i = 65535;
    	printf("%d\n", i);
    	return 0;
    }
    

    i为-1。因为short占2字节,所以是16位,

    short最大值为0111 1111 1111 1111,为32767

    short最小值为1000 0000 0000 0000,首位为符号位,1代表负数所以得转为原码

    首位符号位取反,其余所有位也取反后最后一位加1

    即0111 1111 1111 1111 + 1 = 1000 0000 0000 0000即32768,所以该负数的原码为32768,该负数为-32768

    65535比32767溢出32768,而溢出1就是-32768,因此溢出32768偏移32767就是-32768+32767=-1。
     

    总结,无符号数与有符号数的运算原则如下:

    1、参与运算的类型不同,会自动转换成相同类型再运算。

    2、转换的方向为向数据长度增长的方向,char->short->int->unsigned int ->long

    3、所有float都会先转成double进行运算,哪怕只有一个float

    4、赋值运算时,赋值号右边的类型向左边的类型转换。

    5、浮点数和整形数,整形数向浮点数转换。

    6、在表达式中,如果char和short类型的值进行运算,无论char和short有无符号,结果都会自动转换成int。

    7、如果char或short与int类型进行计算,结果和int类型相同。即:如果int是有符号,结果就是带符号的,如果int是无符号的,结果就是无符号的。

    展开全文
  • 搞了半天,调试发现,这个玩意儿检测出来 是溢出的,还是无符号,溢出的时候...想得到负数就的先减然后把结果给无符号数,或者定义为有符号数,这个东西,在我用ABS宏的时候,把我搞懵逼了。 用了10多年的C语言。 ...

    搞了半天,调试发现,这个玩意儿检测出来 是溢出的,还是无符号,溢出的时候,减出的结果巨大。

    想得到负数就的先减然后把结果给无符号数,或者定义为有符号数,这个东西,在我用ABS宏的时候,把我搞懵逼了。

    用了10多年的C语言。

    展开全文
  • C语言无符号数跟有符号数之间运算 先来看一个程序: 运行结果: 刚刚无意中发现的,第一反应觉得有问题,n是无符号型的,不可能等于-1,因此不可能跳出循环,但结果却跳出了循环,也就是说无...

    先来看一个程序:

       

     运行结果:

      

     

    刚刚无意中发现的,第一反应觉得有问题,n是无符号型的,不可能等于-1,因此不可能跳出循环,但结果却跳出了循环,也就是说无符号数=-1?

    以下是我的理解:

    实际上,在符号数跟无符号数的比较过程中:符号数会转换成无符号数。本质上说,符号数跟无符号数在计算机中都是用补码表示的,只是解释的方式不同罢了,而比较的是它们的二进制各个位是否都相同(不管最高位是不是符号位)。

     

    再看:


     

    另外,加减运算也是同样的道理,补码之间进行加减运算,把最后的结果根据不同的解释方式来解释(符号数输出则最高位为符号位,无符号输出最高位为数据位)。

     

     

     

     

    posted on 2015-01-10 11:56 Anthony007 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/anthony007/p/4214676.html

    展开全文
  • 我想问的是网上资料说的都是有符号数int 向无符号数unsigned int转化 ,因为在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647 ,unsigned int是32位,范围0 to 4,294,967,295,所以int向范围更大的...
  • C语言无符号数减法

    2021-05-17 11:33:15
    测试代码 void ChkTest...无符号数和有符号数进行算数运算,先转有符号为无符号,然后运算(可能存在截断情况)。 3.负数实际在内存中是以补码形式存在,%d格式输出的不是存储的原始数据,%x输出的才是内存原始数据。

    测试代码

    void ChkTest(void)
    {
        unsigned int cnt1 = 1;
        unsigned int cnt2 = 2;
        unsigned short a = 1;
        unsigned short b=-1;//等价于unsigned short b=0xFFFF;
        unsigned short c=0;
        
        c = a-b;
        printk("cnt1-cnt2=%x %d\r\n",cnt1-cnt2,cnt1-cnt2);
        printk("a-b = 0x%X  a-b = %d c=0x%x\n",a-b,a-b,c);
    }

    执行结果:cnt1-cnt2=ffffffff -1
    a-b = 0xFFFF0002  a-b = -65534 c=0x2

    分析首先CPU没有减法操作,需要把减法转为加法运算,

    则1-2转为加法操作1+(-2)对应实际正数的补码为自己,负数的补码为其反码+1,

    [+1] = [00000000 00000000 00000000 00000001]原 = [00000000 00000000 00000000 00000001]反 = [00000000 00000000 00000000 00000001]补

    [-2] = [10000000 00000000 00000000 0000010]原 = [11111111 11111111 11111111 11111101]反 = [11111111 11111111 11111111 11111110]补

    1-2= [00000000 00000000 00000000 00000001]+[11111111 11111111 11111111 11111110]=[11111111 11111111 11111111 11111111]

    这个结果使用%x输出为实际内存中的数据,

    %d输出为转为有符号的结果([11111111 11111111 11111111 11111111]再求补码[10000000 00000000 00000000 00000001 ]);

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    同理a-b=1-(-1)=1+(-(-1))操作转补码:

    [+1] = [00000000 00000001]原 = [00000000 00000001]反 = [00000000 00000001]补

    [-(-1)]=-0xFFFF, printk("a-b = 0x%X  a-b = %d c=0x%x\n",a-b,a-b,c);这句打印语句隐含了%X和%d是四字节返回值,c是2字节值

    则前段计算红色a-b值需要转为4字节运算,而c = a-b;执行2字节的运算(存在截断情况)

    扩展四字节[-(-1)] = [-(11111111 11111111) ] =

    [10000000 00000000 11111111 11111111) ]原 =[11111111 11111111 00000000 00000000]反 = [11111111 11111111 00000000 00000001]补

    1+(-(-1))=[00000000 00000001]+[11111111 11111111 00000000 00000001]=[11111111 11111111 00000000 00000010]

    这个结果使用%x输出为实际内存中的数据(0xFFFF0002),

    %d输出转为有符号的结果([11111111 11111111 00000000 00000010]再求补码[10000000 00000000 11111111 11111110 ]);

    c=0x%x两字节[-(-1)] = [-(11111111 11111111) ] 符号位和数据位重叠,假设扩展为4字节表示,具体值同上,符号位在最高位(这里暂未确认编译器如何处理);

    1+(-(-1))=[00000000 00000001]+[11111111 11111111 00000000 00000001]=[11111111 11111111 00000000 00000010],截断后两个字节赋值给c。

    这个结果使用%x输出为实际内存中的数据0x0002([00000000 00000010]补码同原码);

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    总结:

    1.分析减法需要明确补码的使用方式,不能按照数学常识计算1-2=-1。

    2.无符号数和有符号数进行算数运算,先转有符号为无符号,然后运算(可能存在截断情况)。

    3.负数实际在内存中是以补码形式存在,%d格式输出的不是存储的原始数据,%x输出的才是内存原始数据。

     

    展开全文
  • 程序功能:将无符号数转换成2~16进制数,将结果输出。
  • 对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移。变量的声明和初始化如下: int x=foo();//arbitrary value int y=bar();//arbitrary value unsigned ux = x; unsigned uy = y; 对于下面表达式,...
  • 是不是大家现在全部都使用C语言了呢?这些是从keilc中的反汇编来的,个人感觉代码很紧凑.值得学习.C?UIDIV:C:0x0003 BC000B CJNE R4,#0x00,C:0011C:0x0006 BE0029 CJNE R6,#0x00,C:0032C:0x0009 EF MOV A,R7C:0x000A 8...
  • 无符号数 unsigned 结构体指针 整型提升 关于编译顺序的问题 本文有后续详细讲解 无符号数 unsigned 它和普通的变量定义是一样的,只不过差别在于系统对这块内存空间的识别不同。在下例中给n传的实参是-1,...
  • C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。 unsigned int和int进行运算 直接看例子来说明问题...
  • C语言无符号数相减的一个错误用法

    千次阅读 2019-01-10 16:43:30
    使用红黑树的时候遇到一个奇怪的问题,树没有正确平衡,查了半天才发现是比较函数有问题,下面是比较...当输入0xbe04010a,0x3902010a的时候,返回值是负数,无符号的0xbe04010a明显比0x3902010a,这么用肯定会出...
  • 满意答案 cherish1984 2013.09.08 采纳率:44% 等级:12 已帮助:9667人 code SEGMENT ASSUME CS:code start: MOV AH,1h INT 21h ;...如果题目本身要求比较两个四位无符号数的话,就把那两条语句填上吧。 20分享举报
  • C语言无符号数赋值为负数时的%d%u输出问题解释

    千次阅读 多人点赞 2020-01-14 00:42:50
    文章目录问题发现什么是...近日在练习过程中发现无符号整形如果赋值为“-1”可以用%d进行输出,从而得到问题 代码如下 #include<stdio.h> int main() { unsigned int e = -1; //输出结果是-1,说明这里无...
  • 最近在做个项目,程序有个bug,调了好几个小时才发现原来是无符号数移位问题!!! 于是编写了如下代码: #include <stdio.h> int main(int argc, char *argv[]) { unsigned int a=0xffffffff; a=a&...
  • 代码如下:#include<stdio.h> int main(void) { int len = -4; unsigned len2 = 5; if(len - len2 >= 0) printf("%d\n", len * len2); else printf("0\n");...请按任意键继续....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,289
精华内容 915
关键字:

c语言无符号数

c语言 订阅