精华内容
下载资源
问答
  • 目录一、补码二、负数时的有符号整型和无符号整型的转换三、关于无符号的笔试题一、补码有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1例如:有符号数 1000 0011,其最高位1代表负,其真正数值是 ...

    目录

    一、补码

    二、负数时的有符号整型和无符号整型的转换

    三、关于无符号的笔试题

    一、补码

    有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1

    例如:有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(无符号数1000 0011转换成十进制等于131)

    原码:

    原码就是符号位加上真值的绝对值,即用第一个二进制位表示符号(正数该位为0,负数该位为1),其余位表示值。

    反码:

    正数的反码与其原码相同;

    负数的反码是对其原码逐位取反,但符号位除外。

    补码:

    正数的补码就是其本身;

    负数的补码是在其反码的基础上+1

    例如:

    [+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补

    [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

    二、负数时的有符号整型和无符号整型的转换

    当执行一个运算时(如这里的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号 参数强制类型为无符号数,并假设这两个数都是非负的,来执行这个运算。

    我们知道,整数在计算机中通常是以补码的形式存在的,而-1的补码(用4个字节储存)为1111,1111,1111,1111。而C语言对于强制类型转换是怎么处理的呢?对大多数C语言的实现,处理同样字长的有符号数和无符号数之间的相互转换的一般规则是:数值可能会改变,但是位模式不变。也就是说,将unsigned int强制类型转换成int,或将int转换成unsigned int底层的位表示保持不变。

    也就是说,即使是-1转换成unsigned int之后,它在内存中的表示还是没有改变,即1111,1111,1111,1111。我们知道在计算机的底层,数据是没有类型可言的,所有的数据非0即1。数据类型只有在高层的应用程序才有意义,也就是说,同样的储存表示对于应用程序而言可能对应着不同的数据,例如1111,1111,1111,1111对于有符号数而言它表示-1,但对于无符号数而言,它表示UMax(因为没有符号位,就像正数的反码补码都是它本身一样,1111,1111,1111,1111的原码依然是它本身,且最高位也不表示符号位),但是它们的底层存储都是一样的。现在你应该明白为什么-1转换成无符号数之后,就成了UMax了吧。

    unsigned int b = -1;

    printf("%d\n", b);

    printf("%u\n", b);

    输出结果:

    3ecaff5c7886460790490254836631e2.jpg

    三、关于无符号的笔试题

    以下反向遍历array数组的方法有什么错误?

    vector array;

    array.push_back(1);

    array.push_back(2);

    array.push_back(3);

    //方向遍历array数组

    for(vector::size_type i = array.size()-1; i>0; --i)

    {

    cout<

    1)vectorarray;

    2)vectorsize_type

    3)首先for循环应该是i>=0,但是:

    vector::size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。

    参考:

    1.https://www.jianshu.com/p/3004e5999be4 你真的了解补码吗?

    2.https://blog.csdn.net/ljianhui/article/details/10367703 都是类型惹的祸——小心unsigned

    3.https://blog.csdn.net/qq_36767247/article/details/78444744 浅析无符号整型和有符号整型

    4.http://c.biancheng.net/view/1332.html c++数据溢出

    展开全文
  • c语言无符号整型

    千次阅读 2010-10-25 22:46:00
    #include #include int main(){  char a[] = "hello";  char b[] = "hi";...strlen的结果是个无符号数,所以strlen(a)-strlen(b)的结果也将是无符号数,不可能是负的。 (参考书籍:c和指针)

    #include <stdio.h>

    #include <string.h>

    int main(){

        char a[] = "hello";
        char b[] = "hi";
        if( (strlen(b)-strlen(a))>=0 )
            printf("It's strange!/n");
        return 1;
    }

     

    strlen的结果是个无符号数,所以strlen(a)-strlen(b)的结果也将是无符号数,不可能是负的。

    (参考书籍:c和指针)

    展开全文
  • C语言无符号型别是什么意思啊?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!C语言无符号型别是什么意思啊?无符号型别就是不表示负数,只表示...

    C语言中无符号型别是什么意思啊?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    e6a8d59a1d124bf632ccbf6d03eb1821.png

    C语言中无符号型别是什么意思啊?

    无符号型别就是不表示负数,只表示正数的资料型别。

    通常在资料型别关键字前加unsigned。

    无符号的资料型别主要有以下几类:

    unsigned char 无符号字元型 ,能表示的数的范围为0~(2^8-1)

    unsigned int 无符号整型 ,能表示的数的范围为0~(2^16-1)

    unsigned long int 无符号长型 ,能表示的数的范围为0~(2^16-1)

    c语言中168u说是无符号型别,到底是什么含义,和168有什么关系?

    无符号型别就是在计算机内部,这个数的二进位制最高位不是符号位,因此无符号数只能是正数不能是负数。因此无符号数在表示数字的时候,他的正数范围比有符号数的范围大。

    在有符号和无符号数字有效范围重叠的不符,两者是没有区别的,但是在不重叠的部分,两者就不一样。

    举一个例子,假设数字是8位的,有符号数符号位是8位:

    比如整数15:

    用二进位制表示有符号数是:0000 1111

    用二进位制表示无符号数是:0000 1111

    两者没有区别。

    在看一个例子204:

    用二进位制表示无符号数:1100 1100

    用二进位制表示无符号数:因为最高位是符号位,1代表这是一个负数,因此超出了表达范围,用8位的2进位制数无法表示

    c语言中表达式的型别是什么意思

    补充楼上:

    逻辑表示式 :&&(并)、||、!,例子:a&&b

    算数表示式:就是加减乘除表示式,例子:a+b-c

    关系表示式:==、!=、、<=、>=,例子:a != b

    赋值表示式:=,例子:a = b

    条件表示式:?:,例子:a>b ? 1:0,意思是如果a>b,此表示式值为1,反之为0

    此外,还有复合表示式,复合意思就是上面的型别叠加,如 +=,例子:a += b,表示a = a + b

    ps:楼主可以根据表示式命名去理解

    JAVA中型别(char、long、int.一共八个)有符号和无符号是什么意思

    有符号和无符号指的是数值的正负性。比如int型别,其无符号的取值范围为:0~65535,有符号的取值范围为:-32768~32767。但得指出的是char无有符号和无符号之分!

    C语言中浮点数文字预设型别是什么意思?

    浮点数就是说的小数:12.5892之类的。

    这个预设型别就是说程式设计师没有定义这个型别,系统自动把它定义成预设型别!浮点数文字预设型别这个我也是没有听说过的。你没有弄错吗?可能是我学识太少吧。

    为什么 Java 不提供无符号型别

    因为高阶语言不需要进行 复杂的运算

    Java的优势是安全不追求效率

    Java不能直接访问记忆体 也就没有 符号的概念

    c++中的 指标,无符号位,全域性变数,记忆体释放,多继承等等  用不上的功能都被 精简化了 目的就是 让程式码不在那么复杂

    c语言中符号 & 什么意思

    & 表示 与操作

    例如:

    a&b 表示的就是a、b进行与操作

    C++中整型常量中的有符号和无符号是什么意思

    正负符号

    int a=-1;有符号常量赋值给有符号整数变数

    UINT b=-1;错误,无法将负数赋值给无符号整数变数

    c++语言中以无符号的十进位制形式输出整数是什么意思

    就是没有正负,在c++的形式是unsigned int。

    正常的数储存时是把这个数的在机器记忆体里的最高位存成符号位,比如:

    int:0||0000000 00000000 00000000 00000001

    符号||数

    如果没有符号就是全是数

    字元型常量资料中无符号型别,怎么弄?

    short int 是16 bit 有符号整型数 int 是32 bit 有符号整型数 (TC 是16 bit) 字元型常量 是 字元的ASCII 值,整型。 无符号和有符号的区别是 少一个符号位,多一个数据位。 例如 16 bit 无符号整型数WORD, 资料为 16 位 对应的 short int 是有符号整型数,资料为 15 位,最高位是符号位。 char 按字元运算,要用 strcmp(),strcpy() 比较,赋值。

    分页:123

    展开全文
  • C语言无符号数和有符号数之间的运算 C语言无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数...

    C语言中无符号数和有符号数之间的运算

                   C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。

    unsigned int和int进行运算

    直接看例子来说明问题吧

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             int a = -1;
    
             unsigned int b = 16;
    
             if(a > b)
    
                      cout<<"负数竟然大于正数了!\n";
    
             return 0;
    
    }

    复制代码

     

    输出结果为:

     

     

    这是因为a和b进行比较的时候,编译器将有符号数a看成了无符号数,然后再和b进行比较,在内存中(32位)

    a : 11111111 11111111 11111111 11111111

    b : 00000000 00000000 00000000 00010000

    看成无符号数,自然是a>b。

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             int a = -1;
    
             unsigned int b = 16;
    
             cout<<a + b<<endl;
    
     
    
             int c = -16;
    
             unsigned int d = 15;
    
             cout<<c + d<<endl;
    
             return 0;
    
    }

    复制代码

     

    输出结果为:

     

     

    可以看到a+b的结果貌似比较正常,但是c+d和我们想象的好像不太一样。其实4294967295就是11111111 1111111 11111111 1111111就是-1在内存中的形式,看成无符号数就是这个结果啦。所以unsigned int和int做运算会将int看成unsigned int,而且结果也是unsigned int。

     

    unsigned char和char进行运算

    看一个颠覆上面逻辑的例子:

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             char a = -16;
    
             unsigned char b = 14;
    
             if(a > b)
    
                      cout<<"负数大于正数了!\n";
    
             cout<<a+b<<endl;
    
             return 0;
    
    }

    复制代码

     

    输出结果:

     

     

    如果按照上面unsigned int和int进行运算的逻辑,这里unsigned char和char进行运算,那应该是a要看成无符号数,所以a的值比较大呀,而且a+b的结果应该是-2对应的无符号数,也就是254才对呀?

    之所以会出现上面的结果是因为,C语言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算,至于为什么选择转换为int,应该是从效率上考虑的,因为通常情况下int的长度被定义为机器处理效率最高的长度,比如32位机上,一次处理4个字节效率是最高的,所以虽然short(我机器上占2个字节)更节省内存,但是在运算中的效率,是int更高。所以上面,无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int,所以算术运算的结果也是带符号的。

    但是还需要注意一个问题就是转换成int类型的时候,高位补齐的问题。

    如果是unsigned的类型转换成int类型,高位补0.

    如果是signed的类型转换成int类型,如果原来最高位是1则补1,如果是0则补0。

    比如:

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             char a = -16;
    
             unsigned char b = 255;
    
             char c = 255;
    
             cout<<a+b<<endl;
    
             cout<<a+c<<endl;
    
             return 0;
    
    }

    复制代码

     

     

     

    其中char c = 255,在内存中为11111111,最高位是1,转换成int时高位补1,也就是11111111 11111111 11111111 11111111,就是-1

    注意:转换成unsigned int类型时,也是一样的。

    比如:

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             char a = 255;
    
             unsigned int b = a;
    
             cout<<b<<endl;
    
     
    
             char c = 15;
    
             unsigned int d = c;
    
             cout<<d<<endl;
    
             return 0;
    
    }

    复制代码

     

     

    a在内存中为11111111,最高位是1,转换时高位补1,也就是

    11111111 11111111 11111111 11111111,也就是无符号数2^32

    c在内存中为00001111,最高位是0,转换高位补0,也就是

    00000000 00000000 00000000 00001111,还是15

    复制代码

    #include <iostream>
    
    using namespace std;
    
     
    
    int main()
    
    {
    
             unsigned char a = 255;
    
             int b = a;
    
             cout<<b<<endl;
    
     
    
             unsigned char c = 15;
    
             int d = c;
    
             cout<<d<<endl;
    
             return 0;
    
    }

    复制代码

     

     

     

    对于unsigned char在转换成int或unsigned int时,无论最高位是0还是1,都补0。

     

    对于unsigned short和short进行运算,和char和unsigned char一样,都是要先转换成int,然后再进行运算。

    转换时高位补齐的方法也和unsigned char、char一样。

    展开全文
  • 计算机中的符号位 1.数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 验证计算机用最高位表示符号位 结果为 : 2. 有符号数的表示法 在计算机内部用 补码 表示...
  • 无符号数 unsigned 结构体指针 整型提升 关于编译顺序的问题 本文有后续详细讲解 无符号数 unsigned 它和普通的变量定义是一样的,只不过差别在于系统对这块内存空间的识别不同。在下例中给n传的实参是-1,...
  • #define ISUNSIGNED(x) ((x)>=0&&~(x)>=0) #define ISSINGNED(x) ((x)>... 有符号与无符号的区别:最高位是否为1 ,有符号最高位为1表示负数. 转载于:https://www.cnblogs.com/start201...
  • 文章目录`limits.h` 的不足有符号整型的编码计算方法需要注意的地方以 int 传递 short取模位移 limits.h 的不足 通过库 limits.h 中的常量,我们可以得知绝大多数整型的范围。但是其中并没有 long long 类型的取值...
  • C语言之有符号无符号整数取值范围

    万次阅读 2016-03-08 08:44:45
    n位二进制有符号整数取值范围
  • C语言的同学看看以下代码运行结果会多少 源代码 #include &lt;stdio.h&gt; void main(void) { unsigned char uchar_num = 1; char schar_num = -2; unsigned int uint_num = 1; int sint_num = -2...
  • 新编C语言程序设计第2章基本数据类型* 第 2章 基本数据类型 第 2章 基本数据类型 2.1 整型 2.2 浮点型 2.3 字符型 2.4 逻辑类型 2.5 标准函数 2.6 量的定义方法 2.1 整 型 2.1.1 基本整型 1. 类型名称 int ...
  • #include<stdio.h> int main(void) { //数类型 标识符=值 ... //%u——输出unsigned int类型-即表示输出一个无符号十进制整型数据 //% d——输出int类型 signed int a = -10; printf("%d\n", a);
  • int 是无符号的整数类型,直白点说有符号无符号整型就是能不能存放负数。 根据程序编译器的不同,整形定义的字节数不同。51类单片机的C语言中,int代表2个byte(16位);如果是32位ARM处理器的C语言中,则int代表4...
  • C语言中提供了很多整数类型(整型),主要区别在于它们取值范围的大小。int代表有符号的整数,也就是说,用int声明的变量可以是正数也可以是负数,也可以是零,但是只能是整数。 比如:int a = 3; int b = 0;...
  • 1、与C语言不同,Java里没有无符号(unsigned)整型。 JAVA的8种基本类型(boolean,byte,short,char,int,long,float,double)都是有符号的。 2、与c语言不同,JAVA里的char类型,占2个字节,专为存放...
  • C语言中提供了很多整数类型(整型),主要区别在于它们取值范围的大小。int代表有符号的整数,也就是说,用int声明的变量可以是正数也可以是负数,也可以是零,但是只能是整数。 比如:int a = 3; int b = 0;...
  • C语言中的有符号数与无符号

    千次阅读 2014-08-14 07:53:33
    1. C语言支持所有整型数据类型的有符号和无符号运算,尽管C语言标准并没有指定用哪种方式来表示有符号整数,但是几乎所有的 机器都使用补码。 2. C语言中默认的整形数据是有符号的,并且允许无符号数和有符号数...
  • C语言 有符号类型转换为无符号类型

    千次阅读 2019-01-04 10:55:58
    例如 有符号类型和无符号类型运算,有符号类型转换为无符号类型。 需要注意的有两种情况: 1、有符号和无符号的算术运算 2、有符号和无符号的比较运算 一、验证有符号类型转换为无符号类型: 程序: #include &...
  • 话题:怎样用c将无符号整型转化为字符型回答:可以通过函数itoa来转换,int i;char tmpstr[5];itoa(i, tmpstr, 10);这样就可以了.还可以通过转换来完成,int i;char s;s = (char)i;参考回答:你将这个无符号整形直接...
  • 我用long int怎么不行呢基本定义形式为: long var... 初始化值的定义形式为: long var_name; 二、单独写long,表示为有符号整型C语言整型常数,什么是长整型常数?长整型数是相对于基本整型数而言的,一般...
  • 因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。  首先进行一个实验,分别定义一个signed int型数据和unsigne
  • C语言的基本符号

    2020-03-16 12:59:00
    标识符 由大小写字母、数字(0~9)和下划线(_)组成 第一字符只能是字母或者下划线 c语言是大小写敏感的语言(python也是) 关键字

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,753
精华内容 13,901
热门标签
关键字:

c语言定义无符号整型

c语言 订阅