精华内容
下载资源
问答
  • 计算机以二进制补码存储数值,当...有符号char范围: 有符号char最大值(正数):0111 1111即127,最小值1000 0000(补码) 即-128。 注1000 0000 -1=0111 1111 即2^7-1=128-1=127; -128即- 2^7; 所以符号...

    计算机以二进制补码存储数值,当一个具有符号位的数据值储存在计算机中的时候,计算机会以最高位为符号位,其余位数取该数绝对值的二进制补码来储存。
    有符号char范围:
    有符号char最大值(正数):0111 1111即127,最小值1000 0000(补码) 即-128。
    注1000 0000 -1=0111 1111 即2^7-1=128-1=127;
    -128即- 2^7;
    所以有符号char 取值范围[-128,127];当超过这个取值范围就会溢出。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    我觉得可以形象的画一个图:
    这里写图片描述
    无符号char取值范围:
    无符号最大值即1111 1111 即255,最小值为0;
    注:10000 0000 - 1 = 1111 1111即2^8-1即256-1=255;
    所以无符号char 取值范围[0,255]。
    有符号无符号int取值范围
    同理,有符号int 取值范围[- 2^31 , 2^31-1];
    无符号int取值范围[ 0,2^32-1]。
    这里写图片描述
    注:32767没有达到有符号整型的范围。

    展开全文
  • C++中程序运行报错 isctype.c 文件中56行断言,报错如下: 测试代码: #include "stdafx.h" #include <...int _tmain(int argc, _TCHAR* argv[]) ... char c = '高'; a = isspace(c); //断言,引发上面所说...

    C++中程序运行报错 isctype.c 文件中56行断言,报错如下:

     

    测试代码

    #include "stdafx.h"
    #include <iostream>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a = 0;
    	char c = '高';
    
    	a = isspace(c);         //断言,引发上面所说的错误提示
    	a = isspace((unsigned char)c);         //正确,无断言
    
    	std::cout << "2 :" << std::dec << (int)c << std::endl;
    	std::cout << "1 :" << std::hex << (int)c << std::endl;
    
    	std::cout << "3 :" << std::dec << (int)(unsigned char)c << std::endl;
    	std::cout << "4 :" << std::hex << (int)(unsigned char)c << std::endl;
    
    	std::cin >> a;
    	return 0;
    }

    运行结果

     

    原因分析:

    由于有些编译环境中的char类型默然不是unsigned char,编译时被认为是带符号的值signed char,导致char类型的变量在直接转换成int类型的时候,会补位原值的符号位,比如原char的值得二进制值是1101 1111(df),直接转int类型之后的值是ff ff ff df,转换时补位值是原值的符号位1,而不是零,所以在把char类型的值转换成int时,由于补位为1,导致转换出来的int值不在[-1, 255]这个范围,引发 isctype.c 中的 assert(c >= -1 && c <= 255) 断言。

    修改建议

    1. char转int时先最好先转unsigned char,然后在转int,没有补位符号位问题,无符号unsigned转换使用0补位

    2. 所有的char类型都用unsigned char替换,屏蔽char类型的使用

    仅供参考,如有问题,欢迎留言指出,谢谢!

    展开全文
  • 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类型再运算,这会导致结果分析极其繁琐,结果不同不代表无符号和有符号这个运算规则有错。













     

    展开全文
  • char类型与int类型的相互转换、有无符号数的赋值 相关知识: 1.计算机中的一个unsigned char型数据表示0~255,而一个signed char型数据表示-128~+127,都是256的数字。这256个数字,在计算机的存储单元都是由0x00~...

    char类型与int类型的相互转换、有无符号数的赋值

    相关知识:

    1.计算机中的一个unsigned char型数据表示0~255,而一个signed char型数据表示-128~+127,都是256的数字。这256个数字,在计算机的存储单元都是由0x00~0xFF表示的。

    2.这256个数字相同的部分是0~+127,都用0x00~0x7F表示存储。而0x80~0xFF即可以表示+128~+255,也可以表示-128~ -1。当为unsigned char 时,0x80表示为+128~+255;当为signed char时则表示为-128~ -1。

    3.计算机中的负数以二进制补码表示,补码 = 二进制数(原码)的反码 + 1

    4.正数的补码与原码相同

    一、长字节数据类型转为短字节数据类型(发生截断)

    int main()
    {
    	int i = 230;
    	char c = i;
    	unsigned char uc = i;
    	printf("%x\t%d\n",c,c);      //ffffffe6   -26
    	printf("%x\t%d\n", uc, uc);  //e6          230
    	return 0;
    }

    十进制230转为二进制表示为11100110,前面的0先不考虑,因为将它转化成为char类型,发生截断,会截取后8个字节,又因为char为有符号数,所以系统在判断11100110时,因为首位为1所以判定为负数,当使用printf打印该数据时,又会将该数据转为int进行扩充,因为第一位是1 所以前面需要补1,所以就是24个1加11100110,又因为负数在内存中是以补码的形式存储,所以求该数据打印结果需要转换,进行-1再取反,得到10000000 00000000 00000000 00011010,除符号位之外为26,再结合前面的符号位为1,所以打印出的数据为-26,但有个问题还存在疑惑,一个是赋值给char截断后的数按照十六进制打印出来,为什么还会打印出这么多位?不应该只有俩位嘛?

    二、短字节数据类型转换为长字节数据类型

    char转换为int:在前面的三个字节补符号位

    如果char的首位为1是负数,则补上0xffffff

    如果char的首位为0时正数,则补上0x000000

    从unsigned char转换为int,则前面补上0x000000.

    三、将负数赋值给无符号数

    int main()
    {
    	unsigned int i = -1;
    	unsigned short s = -1;
    	unsigned char c = -1;
    
    	cout << "i=" << i << endl;  //4294967295
    	cout << "s=" << s << endl;  //65535
    	cout << "c=" << c << endl;  //   (为空)
    }

    负数在内存中以补码形式表示,所以-1原码为10000000  00000000  00000000  00000001求其补码则为11111111  11111111  11111111  11111111,此为转换为4字节的形式,当它给无符号赋值的时候,读取后就为2^32那么大的数了,对应2字节则为2^16大的数,但是还有一个疑问,为什么赋值给unsigned char后打印出来为空?

    其他:

    所谓有无符号的数 他们在位数上相同,如long 和DWORD 同样是32位 只是在第一位会不相同,有符号位的第一位是符号位 

    int: 4byte =  32 bit
    有符号signed范围:2^31-1 ~ -2^31 即:2147483647 ~ -2147483648
    无符号unsigned范围:2^32-1 ~ 0   即:4294967295 ~ 0

    long: 4 byte = 32 bit
    同int型

    double: 8 byte = 64 bit
    范围:1.79769e+308 ~ 2.22507e-308

    long double: 12 byte = 96 bit
    范围: 1.18973e+4932 ~ 3.3621e-4932

    float: 4 byte = 32 bit
    范围: 3.40282e+038 ~ 1.17549e-038

    long long的最大值:9223372036854775807(>10^18)
    long long的最小值:-9223372036854775808
    unsigned long long的最大值:18446744073709551615

    __int64的最大值:9223372036854775807
    __int64的最小值:-9223372036854775808
    unsigned __int64的最大值:18446744073709551615

    展开全文
  • char类型的符号和无符号

    千次阅读 2020-04-04 21:56:44
    在c++中,char默认是符号类型(signed)的,但是为什么一个字符要分符号和无符号呢?这什么区别或者什么意义吗?我开始的时候也总是不明白。查了很多资料发现一个不错的解释,以C++中的char为例:char类型...
  • java中intchar之间的互相转化

    万次阅读 多人点赞 2019-04-28 15:38:12
    在java中intchar之间的互相转化 引言 数据类型 在介绍intchar的转换之前,我们先来回顾一下java中的基本数据类型: | 类型 | 大小 | 包装器类型 | | boolean | - | Boolean | | char | 16-bit | Character | | ...
  • 我做的是一个无线鼠标,stm32用nRF...l 是要转换数组的长度,*table_u 是要转换的无符号数组的指针 *table_i是要转换成int数组的指针直接转换为 char 类型的话是会出错的,结果不对,所以转换为 int。/******** 无符...
  • 比如给一个无符号char型变量a赋予-1时,该变量实际上值会变成255。给一个无符号int型变量b赋予-1时,该变量实际上值会变成4294967295。 这种现象平常会发生在隐式转换中,比如在下面两个题中,判断一下...
  • 在C语言中,数字常量如果没有后缀‘U'或'u',则默认为是符号。 同类型整数之间的类型转换。...其中1024和oxff这两个常量都是符号数,这就意味着每个赋值操作包含了一个隐式的由符号数到无符号数的类型
  • 符号数和无符号数的转换及思考

    万次阅读 多人点赞 2016-09-16 21:00:51
    1 符号数和无符号数的表示三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127, 今天查阅了相关资料,于此记下。仍然以8位为例:原码原码的表示范围-127~-0, +0~+127, 共256个数字。正...
  • c/c++ 符号数与无符号数的转换

    千次阅读 2015-11-25 09:43:08
    在开发中,经常会碰到符号数与无符号数之间的转换,有时是隐性,有时是显性。如果不清楚其中规则,则可能带来非常难以排查的bug。
  • C语言——确定char、short、int和short变量符号和无符号时的取值范围 #include <stdio.h> #include <limits.h> // determine ranges of types int main() { // signed types printf("signed char ...
  • 1.符号转换为无符号的整数的规则: unsigned int MySystem::T2U(int x) { if (x >= 0) ...无符号转换为符号的规则:int MySystem::U2T(unsigned int x) { if (x<=INT_MAX) { return x; }
  • 写了这样一段代码,想要将数据按字节打印。(小端机器) ...到底打印单字节符号的char时,为什么会出现打印32位数据;而如果是无符号则不会?难道声明为无符号打印,打印“%x”也是无符号?求指导,谢谢。
  • C语言中类型转换:char转unsigned int

    千次阅读 2017-08-28 16:50:20
      当表达式中存在符号类型和无符号类型时,所有的操作数都自动转换成无符号类型。a为无符号整形,y要被转换为无符号整形。   主要考虑负数的情况,在计算机中负数以其正值的补码形式表示,补码等于反码加一。...
  • 无符号符号 在C语言里,整数的表示有有符号和无符号两种 无符号 符号 32位 64位 unsigned char char 1 1 unsigned short short 2 2 unsigned int int 4 4 unsigned long long 4 8 unsigned ...
  • 位 字节 INT 符号无符号

    千次阅读 2018-10-23 11:24:36
    位(bit): 位,又称比特位,英文是BIT。表示的意义是一个位,也就是1或者0。 字节(byte): 字节,又称8位二进制,英文是byte。...符号与无符号区别就是符号通过首位的定义来区分正数与负数。主要是数...
  • #include #include int main(void) { char cA; unsigned char ucB; unsigned short usC; cA=128; ucB=128; usC=cA+ucB; printf("0X%x\n",usC);//1 usC=cA+(short)ucB;
  • C++ 中符号数转化为无符号

    千次阅读 2017-11-21 19:25:38
    - char 类型占 8 个比特位, unsigned char 类型能表示的数的范围为 0 ~ 2^8 -1,即 0 ~ 255,共 256 个数; - int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~...
  • char类型到底是符号还是无符号

    千次阅读 2018-01-22 17:42:00
    根据c标准,char类型到底是符号整数类型还是无符号整数类型,这取决于c实现,也就是c编译器的作者的想法:( 那么,如何快速的编写一个检测程序,查看当前编译器如何对char进行定义? #include &lt;stdio.h&...
  • 符号数与无符号数之间的转换

    千次阅读 2020-06-29 21:23:43
    针对同一数据类型符号数和无符号数之间的转换,例如 int 和 unsigned int 之间和 char 和 unsigned char 之间 。这种情况下,二者之间的数据类型长度一致,不会发生转换后数据溢出而导致截断的问题。例如把一个int...
  • char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ 255,共 256 个数;int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~...
  • 关于符号数和无符号数的转换

    千次阅读 2019-04-16 14:14:22
    今天在做了一道关于符号数和无符号数相互转换及其左移/右移的问题,被它们之间的转换原理和位移原理搞得头大了。真的很后悔本科的时候没有认真学习《计算机组成原理》/《计算机操作系统》等计算机基础课程。以下是...
  • 无符号数与符号数比较大小

    千次阅读 2017-04-16 18:54:07
    申明: ...在此感谢博主!先出几个题目,再解释一下为什么答案是那样的。题目一:int a = -1; unsigned int b = 1;...结果输出: 1因为无符号数与符号数比较时,要将符号数转化为无符号数,再来比较。a 转化为
  • byte/ byte 数组转换16进制字符串 (需要Netty) ByteBufUtil.hexDump(new byte[]{0x11, 0x11, 0x11, 0x11}) ByteBufUtil.hexDump...byte 转换成无符号Long / Int表示 byte i = (byte) 0xff; Long i1 = Byte.toU...
  • 无符号数:不存在正负之分,所有位都用来表示数的本身。 符号数:最高位用来表示数的正负,最高位为1则表示负数,最高位为0则表示正数。   1.无符号数--->符号数  看无符号数的最高位...1.1将无符号数2
  • C++中charint转换

    千次阅读 2018-05-28 20:32:33
    1 整数转化字符串 sprintf 在头文件 #include&lt;stdio.h&gt;中语法: int sprintf(string format, mixed [args]...);返回值:字符串长度(strlen)转换字符 =-=-=-=-=-=-=-=-=-=-=-=-... %d 整数转成十进...
  • Char转为int时高位符号扩展的问题

    千次阅读 2016-08-21 21:11:09
    代码示例:  static get_utili(constchar*p){int util;...当传入的参数p指向的内容为0x9A、0XAB等内容(最高位为1)时,得到的int型变量util的值将会出错,因为char会进行符号扩展,使得0x9A(十进制的154)变成
  • 这篇文章主要介绍了详解C语言中的char数据类型及其与int类型的转换,是C语言入门学习中的基础知识,需要的朋友可以参考下 C语言中的char变量 char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,125
精华内容 70,850
关键字:

有符号int转成无符号char