精华内容
下载资源
问答
  • C语言 有符号类型转换为无符号类型

    千次阅读 2019-01-04 10:55:58
    例如 有符号类型和无符号类型运算,有符号类型转换为无符号类型。 需要注意的有两种情况: 1、有符号和无符号的算术运算 2、有符号和无符号的比较运算 一、验证有符号类型转换为无符号类型: 程序: #include &...

    C语言中变量的类型变换比较多,有些地方需要时刻注意,不然很可能写出带有bug的代码并深埋入系统,难以察觉。


    例如 有符号类型和无符号类型运算,有符号类型转换为无符号类型。

    需要注意的有两种情况:
    1、有符号和无符号的算术运算
    2、有符号和无符号的比较运算

    一、验证有符号类型转换为无符号类型:
    程序:
    #include <stdio.h>

    int main()
    {
    int a = -20;
    unsigned int b = 6;

    if((a+b) > 0)
    {
    printf("signed to unsigned\n");
    }
    else
    {
    printf("unsigned to signed\n");
    }

    return 0;
    }

    结果为:
    signed to unsigned

    这说明在c语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理。
    这个也验证了有符号和无符号算术运算操作时会将有符号类型转换为无符号类型来计算。


    二、比较运算

    #include <stdio.h>

    int main()
    {
    int a = -2;
    unsigned int b = 1;

    printf("a = %d, b = %u\n\n", a, b);

    if(a > b)
    {
    printf("a > b\n");
    }
    else
    {
    printf("a < b\n");
    }

    return 0;
    }
    结果:
    a > b

    这说明有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数),此时的a的值远大于b。

    =============

    C中有符号数与无符号数转化之间的危险



    无符号数与有符号数之间存在着很多细节问题,稍有不慎就可能导致程序出现不可预料的错误。
     

    陷阱


    在C语言中,如果一个运算包含一个有符号数和一个无符号数,那么C语言会隐式地将有符号数转换为无符号数,这对于标准的算术运算没什么问题,但是对于 < 和 > 这样的关系运算符来说,它会出现非直观的结果,这种非直观的特性经常会导致程序中难以察觉的错误

    看下面的例子:
    int strlonger(char *s, char *t)
    {
    return strlen(s) - strlen(t) > 0;
    }



    上面的函数看起来似乎没什么问题, 实际上当s比t短时,函数的返回值也是1, 为什么会出现这种情况呢?

    原来strlen的返回值类型为size_t,C语言中将size_t定义为unsigned int,当s比t短时,strlen(s) - strlen(t)为负数,但无符号数的运算结果隐式转换为无符号数就变成了很大的无符号数.

    为了让函数正确工作,代码应该修改如下 :
    return strlen(s) > strlen(t);

    2002年, 从事FreeBSD开源操作系统项目的程序员意识到,他们对getpeername函数的实现存在安全漏洞.代码的简化版本如下:
    //void *memcpy(void *dest, void *src, size_t n);

    #define KSIZE 1024
    char kbuf[KSIZE];

    int copy_from_kernel(void *user_dest, int maxlen)
    {
    int len = KSIZE < maxlen ? KSIZE : maxlen;
    memcpy(user_dest, kbuf, len);
    retn len;
    }

    你看出了问题所在吗?


    =========

    测试时一些细节地方会影响结果,需要注意


    1、测试的时候需要注意printf的输出参数对结果的影响:
    #include <stdio.h>

    int main()
    {
    unsigned int a = 1;
    signed int b = -2;

    printf("%d\n", a + b);
    printf("%u\n", a + b);

    return 0;
    }

    printf("%d\n", a + b)中,由于%d的作用,使a+b以有符号十进制的形式输出,此时,最高位的1为符号位,减一取反得到其原码,得到1000 0001,即十进制的-1;

    printf("%u\n", a + b)中,由于%u的作用,使a+b以无符号十进制的形式输出,此时,最高位的1并非符号位,其表示数值大小,不用减一取反,得到1111 1111,实际Linux系统中,该数用4个字节表示,也就是说实际上这里有16个"1",即十进制数的4294967295(=2^32-1)。

    综上,该段程序的输出结果为:

    -1

    4294967295

    2、不要使用char类型来验证这个规则,会使分析变得复杂

    一方面是因为char类型在不同编译器环境下可能是无符号的,也可能是有符号的,取决于编译器的实现。
    【这个可以搜索“char可以是负数吗”来了解。】

    另一方面char类型在运算的时候会提升为int类型再运算,这会导致结果分析极其繁琐,结果不同不代表无符号和有符号这个运算规则有错。













     

    展开全文
  • 有符号类型和无符号类型

    千次阅读 2017-08-02 10:52:12
    有符号类型、无符号类型,原码、反码、补码。

    负数在计算机中如何表示呢?


    1、是否需要有正负。

    如果这个量不会有负值,那么我们可以使用无正负的类型。

    分正负的类型,称为有符号类型;无正负的类型(只有正值),称为无符号类型。


    2、使用二制数中的最高位表示正负。

    (红色为最高位)

    单字节数: 1111 1111

    双字节数: 1111 1111 1111 1111

    四字节数: 1111 1111 1111 1111 1111 1111 1111 1111

     

    当一个数是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。

    当一个数是无符号类型时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

     

    3、无符号类型和有符号类型的范围区别。

    无符号类型中,所有的位都用于直接表示该值的大小。我们举一个字节的数值对比:

    无符号类型: 1111 1111   值:255        1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

    有符号类型: 0111 1111   值:127                    1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

     

    同样是一个字节,无符号类型的最大值是255,而有符号类型的最大值是127。原因是有符号类型中的最高位被挪去表示符号了。

    有符号类型的长处是它可以表示负数。虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍用一个字节的数值对比:

    无符号类型:                            0 -----------------------------255

    有符号类型:        -128 --------- 0 ---------- 127

     

    二者能表达的数值的个数都是256个。无符号类型表达的是 0~255 这256个数,有符号类型表达的是 -128 ~ 127这256个数。

    有符号类型的负数使用补码表示。

     

     4. 原码、反码、补码


    有 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

    00000000 00000000 00000000 00000101

    如果是 -5,在计算机中如何表示?    负数以补码表达

     

    (1)原码:一个整数,按照绝对值转换成的二进制数,称为原码。

    比如 00000000 00000000 00000000 00000101 是5和-5 的原码。

     

    (2)反码:原码按位取反,就是反码。

    取反操作指:1变0; 0变1

    00000101每一位取反,得11111010。

     

    (3)补码:补码=反码+1

    00000101 的反码是:11111010。

    补码 = 11111010 + 1 = 11111011

    -5在计算机中表达为:11111011。转换为十六进制:0xFB。

     

    我们来看int型整数-1在计算机中如何表示:

    1、先得原码:  00000001

    2、得反码:     11111110

    3、得补码:     11111111

    -1在计算机里用二进制表达就是全1。16进制为:0xFF。

     

    ===============================================参考==============================================================

    1. 补码表:

    二进制值(1字节) 十进制值
    1000 0000 -128
    1000 0001 -127
    1000 0010 -126
    1000 0011 -125
    ... ...
    1111 1110 -2
    1111 1111 -1

     

    -1是最大的负整数。

    1111 1111 - 1 = 1111 1110,而1111 1110就是-2。

    这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,最小的负值是1000 0000,也就是-128。


    2. 不同字节数的整数中,如何表达-1这个数:

    字节数 二进制值 十进制值
    单字节数 1111 1111 -1
    双字节数 1111 1111 1111 1111 -1
    四字节数 1111 1111 1111 1111 1111 1111 1111 1111 -1

     

    展开全文
  • 无正负的类型(只有正值),称为无符号类型。 2、使用二制数中的最高位表示正负。 (红色为最高位) 单字节数: 1111 1111 双字节数: 1111 1111 1111 1111 四字节数: 1111 1111 1111 1111 1111 1111 1111 ...

    1、是否需要有正负。

    如果这个量不会有负值,那么我们可以使用无正负的类型。

    分正负的类型,称为有符号类型;无正负的类型(只有正值),称为无符号类型。

    2、使用二制数中的最高位表示正负。

    (红色为最高位)

    单字节数: 1111 1111

    双字节数: 1111 1111 1111 1111

    四字节数: 1111 1111 1111 1111 1111 1111 1111 1111

     

    当一个数是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。

    当一个数是有符号类型时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

     

    3、无符号类型和有符号类型的范围区别。

    无符号类型中,所有的位都用于直接表示该值的大小。我们举一个字节的数值对比:

    无符号类型: 1111 1111   值:255        1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

    有符号类型: 0111 1111   值:127                    1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

     

    同样是一个字节,无符号类型的最大值是255,而有符号类型的最大值是127。原因是有符号类型中的最高位被挪去表示符号了。

    有符号类型的长处是它可以表示负数。虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍用一个字节的数值对比:

    无符号类型:                            0 -----------------------------255

    有符号类型:        -128 --------- 0 ---------- 127

     

    二者能表达的数值的个数都是256个。无符号类型表达的是 0~255 这256个数,有符号类型表达的是 -128 ~ 127这256个数。

    有符号类型的负数使用补码表示。

     

     4. 原码、反码、补码

    有 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

    00000000 00000000 00000000 00000101

    如果是 -5,在计算机中如何表示?    负数以补码表达。

     

    (1)原码:一个整数,按照绝对值转换成的二进制数,称为原码。

    比如 00000000 00000000 00000000 00000101 是5和-5 的原码。

     

    (2)反码:原码按位取反,就是反码。

    取反操作指:1变0; 0变1

    00000101每一位取反,得11111010。

     

    (3)补码:补码=反码+1。

    00000101 的反码是:11111010。

    补码 = 11111010 + 1 = 11111011

    -5在计算机中表达为:11111011。转换为十六进制:0xFB。

     

    我们来看int型整数-1在计算机中如何表示:

    1、先得原码:  00000001

    2、得反码:     11111110

    3、得补码:     11111111

    -1在计算机里用二进制表达就是全1。16进制为:0xFF。

     

    ====================================参考=========================================

    1. 补码表:

    二进制值(1字节)    十进制值
    1000 0000    -128
    1000 0001    -127
    1000 0010    -126
    1000 0011    -125
    ...    ...
    1111 1110    -2
    1111 1111    -1
     

    -1是最大的负整数。

    1111 1111 - 1 = 1111 1110,而1111 1110就是-2。

    这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,最小的负值是1000 0000,也就是-128。

    2. 不同字节数的整数中,如何表达-1这个数:

    字节数    二进制值    十进制值
    单字节数    1111 1111    -1
    双字节数    1111 1111 1111 1111    -1
    四字节数    1111 1111 1111 1111 1111 1111 1111 1111    -1

    参考连接 : https://blog.csdn.net/android_bar/article/details/76571925 
     

    展开全文
  • C++带符号类型和无符号类型

    千次阅读 2016-03-02 16:23:48
     带符号类型表示正数或负数(包括0),而无符号类型只能表示大于或等于0. 按照概念推理,说明int类型是无符号,写成unsigend int 表示我建立的这个int类型只能表示大于或等于0的数
    
    带符号类型表示正数或负数(包括0),而无符号类型只能表示大于或等于0.  按照概念推理,说明int类型是无符号,写成unsigend int 表示我建立的这个int类型只能表示大于或等于0的数
    展开全文
  • VS错误解决 C4146 一元负运算符应用于无符号类型 结果仍为无符号类型 在VS2015下编译NTL库的时候,我编译了NTL库源代码生成静态链接库,在应用程序设置那一步,虽然将应用程序选成了静态链接库,也没有勾选预编译头...
  • C++中带符号类型和无符号类型

    千次阅读 2018-02-27 19:20:37
    //**************************************************************************************************************带符号类型和无符号类型 除去布尔类型和扩展的字符型之外,其他整型可以划分为带符号...
  • error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 原因: 由于编译器SDL安全检查认为这一操作(通常是为无符号整形取负的操作)无效而产生的。 这里我们假设定义一个数值为int INT,在32位机上面...
  • 当某个运算符的运算对象类型不一致,且其中某一个运算对象是无符号类型时,这个需要进行相应地类型转换,至于类型转换的结果,则 依赖于机器中各个整数类型的相对大小 。 当某个运算符的运算对象类型不一致,且...
  • 在我把gmp.h .lib 和.dll文件在vs2017中配置好之后,我找了段gmp代码来测试,结果会出现这个问题:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型  我的代码如下: #include &lt;gmp.h&...
  • C语言中对于表达式中存在有符号数和无符号类型时,将对计算过程进行如何处理,经常听到的说法是: “当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型” 以上这种表述是不准确的,...
  • 在使用VS2015编写程序时候遇到这样的问题,一样的代码在LINUX下却...VS2015中一元负运算符应用于无符号类型的原因和解决 原因: 这一问题是由于编译器SDL安全检查认为这一操作(通常是为无符号整形取负的操作)无...
  • C++ 中含有无符号类型的表达式

    千次阅读 2014-03-07 13:36:23
    对于一个无符号类型和一个有符号类型的加法问题,参见 C++ 中有符号类型到无符号类型的转换 ,下面我们来谈谈一个无符号类型减去一个值的情形,首先看下面的代码: 运行结果如下: i - j 所得到的结果...
  • 当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。 ...
  • java中无符号类型的解决方案

    千次阅读 2017-03-15 17:09:38
    1.无符号和有符号 计算机中用补码表示负数,并且有一定的计算方式;另外,用二进制的最高位表示符号,0表示...在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型。 使用二进制中的最高
  • 3.1.4 无符号类型前面介绍的4中整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。例如,如果short表示的范围为-32768到+32767,则无符号版本的表示范围为0-65535。当然,仅当数值不会...
  • 【c++】无符号类型与负数的比较

    千次阅读 2019-06-12 16:06:17
    【c++】无符号类型与负数的比较 博主在学习中,发现这样一个问题: #include<iostream> using namespace std; int main() { unsigned uint = 10; if(uint>-1) { cout << "yes" << endl...
  • Java之 无符号类型是怎么回事

    千次阅读 2016-09-27 21:32:59
    原文作者:Sean R....Java 中的无符号类型是怎么回事儿? 在 C 和 C++ 这样的语言中,都提供了不同长度的整数类型:char, short, int, long (实际上,char 并不是真正的整数,但是你可以
  • 经常看到很多初学者被有符号类型无符号类型,还有什么首位是符号位blablabla弄的云里雾里,下面用特别简单的例子给大家讲一下,瞬间就懂。 首先3位2进制数能代表多少,很简单 000~111 0~7 一共8个数 这是最简单的...
  • 首先,明确一个概念,什么是有符号数,什么是无符号数。以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数。unsigned int 只可以表示正整数,所以成类似的数为无符号数。在计算机表示中,...
  • #include // (1)数值以补码的形式存储在...若为无符号类型,则大于. // (3)无符号数的最高位为数值,不是符号位,因此不会是负数。 // (4)要考虑类型提升问题。 #defin
  • error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 warning C4244: “=”: 从“double”转换到“float”,可能丢失数据 error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 ...
  • C++开始: 赋值给一个无符号类型

    千次阅读 2019-08-23 16:13:25
    C++中,把负值赋给unsigned 对象是完全合法的,其结果是初始值对无符号类型表示数值总数取模后的余数。所以,如果把-1赋给8位的unsigned char,那么结果是255,因为255是-1对256求模后的值。 1.从数学角度解读: ...
  • -2147483647-1则不会有错误,这跟编译器(vs2017)的内在工作过程相关,在第一种错误的情况下,编译器会先判断2147483648是否大于INT_MAX,检测结果是int装不下,于是会将其转化为unsigned int类型,而之后再次对他...
  • char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ 255,共 256 个数;int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~...
  • 大家好下面通过一段代码说明有符号型与无符号型的区别#include &lt;iostream&gt; #define ZERO 0 #include &lt;climits&gt; int main() { using namespace std; short sam = SHRT_MAX;//SHRT_MAX...
  • java中无符号类型的处理

    千次阅读 2016-10-13 19:27:44
    Java中处理无符号数,(字节位的限制造成的问题)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 423,937
精华内容 169,574
关键字:

无符号类型