精华内容
下载资源
问答
  • 背景数据库里有一张users表,存储用户信息,我们需要增加5个字段filed1~field5,作为用户自定义字段那么我们应该选择什么数据类型呢?应该是char还是varchar呢?解决方案我们先看char和varchar的区别,可以参照此...

    背景

    数据库里有一张users表,存储用户信息,我们需要增加5个字段filed1~field5,作为用户自定义字段

    那么我们应该选择什么数据类型呢?应该是char还是varchar呢?

    解决方案

    我们先看char和varchar的区别,可以参照此链接: MySQL数据库中CHAR与VARCHAR之争

    大概意思是说表面上varchar是变长字符串,有更大的灵活度,但是也会有副作用,同时在实际应用中我发现性能上会有很大问题:

    我刚开始设置的数据类型是varchar(5)(为什么设置成这个,当时脑子不清醒),后来我意识到5太短了,所以我想更改数据表的列类型,用下面的命令:

    alter table users midify filed1 varchar(60) 单身悲剧发生了,服务器io激增,导致服务器瘫痪了!!!!为什么呢?参照这里:MySQL’s ALTER TABLE performance can become a problem with very large tables. MySQL performs most alterations by making an empty table with the desired new structure, inserting all the data from the old table into the new one, and deleting the old table. This can take a very long time, especially if you’re short on memory and the table is large and has lots of indexes. Many people have experience with ALTER TABLE operations that have taken hours or days to complete.

    而且数据表里有好几十万条数据

    经过此事件之后,我觉得有必要搞清楚char和varchar的区别了。经过比较之后我决定选用char,那么长度怎么确定呢?我们在MySql的shell里输入下面的语句:

    > select length("考试星");

    得到的结果是9,也就是说一个中文字符的长度是3。

    字段的属性大概不会超过20,所以我选择char(60), 执行修改命令:

    > alter table users modify filed1 char(60); 几秒钟之后,修改成功,没有导致服务器瘫痪,虽然io有短暂的升高,可见char在性能上应该是优于varchar的

    展开全文
  • 什么是数据类型?计算机不能区分数字和字符的区别,需要我们去告诉他,于是就有了数据类型数字int(整型)在64位系统上,整数的位数为64位,取值范围为2^63~2^63-1,即-9223372036854775808~9223372036854775807>>...

    什么是数据类型?

    计算机不能区分数字和字符的区别,需要我们去告诉他,于是就有了数据类型

    数字

    int(整型)

    在64位系统上,整数的位数为64位,取值范围为2^63~2^63-1,即-9223372036854775808~9223372036854775807

    >>> a = 2**64

    >>>type(a)

    >>> b = 2**60

    >>>type(b)

    bool()

    >>>bool() #无参数时返回False

    False>>> bool(0) #0是False

    False>>> bool(1)

    True>>> bool(2)

    True>>> issubclass(bool, int) #bool 是 int 子类

    True

    float (浮点型)

    即小数

    >>> n = 2.3

    >>>type(n)

    字符串(str)

    定义

    字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,在Python中,加了引号的字符都被认为是字符串!

    >>> name = "Alex Li" #双引号

    >>> age = "22" #只要加引号就是字符串

    >>> age2 = 22 #int

    >>>

    >>> msg = '''My name is Alex, I am 22 years old!''' #3个引号也可以

    >>>

    >>> hometown = 'ShanDong' #单引号也可以

    在下面这种情况,使用单双引号

    msg = "My name is Alex , I'm 22 years old!"

    多行字符串必须用多引号

    msg = '''为你我受冷风吹

    寂寞时候流眼泪

    有人问我是与非 说是与非

    可是谁又真的关心谁

    若是爱已不可为

    你明白说吧无所谓

    不必给我安慰 何必怕我伤悲

    就当我从此收起真情 谁也不给'''

    print(msg)

    特性

    按照从左到右的顺序定义字符集合,下标从0开始顺序访问,有序

    str.png

    可以进行切片操作

    不可变,字符串是不可变的,不能像列表一样修改其中某个元素,所有对字符串的修改操作其实都是相当于生成了一份新数据。

    取消字符的特殊意义

    字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内所有字符均取消特殊意义,在引号前面加

    >>> names = 'th\nth'

    >>> print(names)

    th

    th>>> names = r'th\nth'

    >>> print(names)

    th\nth

    简单拼接

    >>>name'Alex Li'

    >>>age'22'

    >>>

    >>> name + age #相加其实就是简单拼接

    'Alex Li22'

    >>>

    >>> name * 10 #相乘其实就是复制自己多少次,再拼接在一起

    'Alex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex Li'

    注意,字符串的拼接只能是双方都是字符串,不能跟数字或其它类型拼接

    >>>type(name),type(age2)

    (, )>>>

    >>>name'Alex Li'

    >>>age222

    >>> name +age2

    Traceback (most recent call last):

    File"", line 1, inTypeError: cannot concatenate'str' and 'int' objects

    #错误提示数字 和 字符 不能拼接

    常用操作

    def capitalize(self):

    >>> name = 'aaaa'

    >>>name.capitalize()'Aaaa'

    #首字母大写

    def casefold(self):

    >>> c = 'Alex Li'

    >>>c.casefold()'alex li'

    #把字符串全变小写

    def center(self, width, fillchar=None):

    >>> c.center(50, "-")'---------------------Alex Li----------------------'

    #居中显示,第一个数值表示宽度,第二个数值表示补充的字符

    def count(self, sub, start=None, end=None):

    >>> s = "welcome to apeland" #查找元素个数

    >>> s.count('e') #查找'e'个数

    3

    >>> s.count('e',3) #查找e个数,从下标为3的位置开始

    2

    >>> s.count('e',3,-1) #查找e个数,从下标为3的位置开始,到下标为-1时结束

    2

    def endswith(self, suffix, start=None, end=None):

    >> > s = "welcome to apeland"

    >> > s.endswith("land") #判断以什么结尾

    True

    def find(self, sub, start=None, end=None):

    >>> s = "welcome to apeland"

    >>> s.find('e') #找e,返回下标

    1

    >>> s.find('e',2) #从索引2开始找e

    6

    >>> s.find('e',7,-5) #在7和-5之间找e

    -1 #没找到,返回-1

    def index(self, sub, start=None, end=None):

    >>> s = "welcome to apeland"

    >>> s.index('e') #找e,返回下标

    1

    >>> s.index('e',2) #从2开始,找e,返回下标

    6

    >>> s.index('e',7,-5) #在7和-5之间找e

    Traceback (most recent call last):

    File"", line 1, in ValueError: substringnotfound#找不到抛出valueError异常

    def format(self, *args, **kwargs):

    >> > s = "Welcome {0} to Apeland,you are No.{1} user."

    >> > s.format("Eva", 9999) #第零个元素是对应{0},第一个元素是对应{1}

    'Welcome Eva to Apeland,you are No.9999 user.'

    >> > s1 = "Welcome {name} to Apeland,you are No.{user_num} user."

    >> > s1.format(name="Alex", user_num=999) #不用0、1,直接用=连接

    'Welcome Alex to Apeland,you are No.999 user.'

    #类似占位符

    def isdigit(self):

    >>> num = '123'

    >>> num.isdigit() #判断是不是整数

    True #是整数返回True

    >>> s = "welcome to apeland"

    >>>s.isdigit()

    False#不是整数返回False

    >>> nume = '12.1'

    >>>nume.isdigit()

    False#小数也返回False

    #需要用户输入整数时,先判断是否是整数,再把字符创强行转换成整型

    def islower(self):

    >>> s = "welcome to apeland"

    >>> s.islower() #判断都是小写

    True#都是小写返回True,不都是返回False

    def isspace(self):

    >>> asd = ' '

    >>> asd.isspace() #判断是不是空格,只有空格才返回True

    True>>> asd = 'asd'

    >>>asd.isspace()

    False

    def isupper(self):

    >>> asd = 'ASD'

    >>> asd.isupper() #判断都是大写

    True #都是大写返回True

    >>> asd = 'asd'

    >>>asd.isupper()

    False

    def join(self, iterable):

    >>> n = ['alex','jack','rain']>>> '|'.join(n) #多个字符串用拼接起来,中间是“|”

    'alex|jack|rain'

    #只能拼接字符串,不能拼接数字#其中n = set 时,拼接key

    def ljust(self, width, fillchar=None):

    >>> asd = 'asd'

    >>> asd.ljust(10,'!') #从左开始数,数到 width,不够的在后面补 fillchar

    'asd!!!!!!!'

    def rjust(self, width, fillchar=None):

    >>> asd = 'asd'

    >>> asd.rjust(10,'!') #从右开始数,数到 width,不够的在前面补 fillchar

    '!!!!!!!asd'

    def lower(self):

    >>> asd = 'ASD'

    >>> asd.lower() #把所有字母变成小写

    'asd'

    def upper(self):

    >>> asd = 'asd'

    >>> asd.upper() #把所有字母改成大写

    'ASD'

    def strip(self, chars=None):

    >>> asd = '\nasd\t'

    >>> asd.strip() #去掉两边的空格和\n,\t等

    'asd'

    def lstrip(self, chars=None):

    >>> asd = '\nasd\t'

    >>> asd.lstrip() #去掉左边的空格和\n,\t等

    'asd\t'

    def rstrip(self, chars=None):

    >>> asd = '\nasd\t'

    >>> asd.rstrip() #去掉右边的空格和\n,\t等

    '\nasd'

    def replace(self, old, new, count=None):

    >>> asd = 'asd 120 , zxc 120 , qwe 20'

    >>> asd.replace('120','20') #把字符 120 替换成字符 20

    'asd 20 , zxc 20 , qwe 20'

    >>> asd.replace('20','120',2) #把字符20 替换成字符 120 ,而且替换次数不超过2

    'asd 1120 , zxc 1120 , qwe 20'

    def rsplit(self, sep=None, maxsplit=-1):

    >>>s'welcome to apeland'

    >>> s.rsplit(' ') #以" "为分隔符,从右边开始分割#如果是s.rsplit( ),则包含\n、\t

    ['welcome', 'to', 'apeland']>>> s.rsplit('e') #以"e"为分隔符,从右边开始分割

    ['w', 'lcom', 'to ap', 'land']>>> s.rsplit('e',2) #以"e"为分隔符,从右边开始分割,分割2次

    ['welcom', 'to ap', 'land']

    def split(self, sep=None, maxsplit=-1):

    >>>s'welcome to apeland'

    >>> s.split('e',2) #从左边开始以e为分隔符开始切割,切割2次,即形成3个子字符串

    ['w', 'lcom', 'to apeland']

    def startswith(self, prefix, start=None, end=None):

    >>>s'welcome to apeland \nasd\tqwer'

    >>> s.startswith('st') #判断从 st 开始

    False>>> s.startswith('wel') #判断是从 wel 开始

    True>>> s.startswith('el',1) #从 索引1 开始,判断是从 el 开始

    True

    def swapcase(self):

    >>> asd = 'aaAAaa'

    >>> asd.swapcase() #大小写互换

    'AAaaAA'

    def zfill(self, width):

    >>> aaa = 'aaa'

    >>> aaa.zfill(10) #指定宽度10,不够的用零补,补在前面

    '0000000aaa'

    列表(list)

    定义

    []内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素

    >>> na = [12,23,34,'asd']>>>na

    [12, 23, 34, 'asd']

    特点

    1.可存放多个值

    2.按照从左到右的顺序定义列表元素,下标从0开始顺序访问,有序

    list.png

    3.可修改指定索引位置对应的值,可变

    列表的操作

    增加操作

    追加

    >>>names

    ['alex', 'jack']>>> names.append("rain") #数据会追加到尾部

    >>> names.append("eva")>>>

    >>>names

    ['alex', 'jack', 'rain', 'eva']

    插入

    >>> names.insert(2,"黑姑娘") #可插入任何位置

    >>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva']#当要在最后个位置增加时,用append,因为insert会把原来位置的元素往后挤

    合并

    >>> n2 = ["狗蛋","绿毛"]>>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva']>>> names.extend(n2) #可以把另一外列表的值合并进来,()里面的拼接在最后

    >>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']

    列表嵌套

    >>> names.insert(2,[1,2,3]) #把[1,2,3]插入到2位置

    >>>names

    ['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']>>> names[2][1] #访问到names的2位置,再在里面访问1

    2

    删除操作

    del删

    >>>names

    ['alex', 'jack', [1, 2, 3], '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']>>> del names[2] #找到下标2的位置,删除它

    >>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']

    pop删

    >>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛', '鸡头']>>> names.pop() #默认删除最后一个元素并返回被删除的值

    '鸡头'

    >>>names

    ['alex', 'jack', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']>>>help(names.pop)>>> names.pop(1) #删除指定元素

    'jack'

    #删除之后返回删除的值

    清空

    >>>n2

    ['狗蛋', '绿毛', '鸡头']>>> n2.clear() #清空该列表里面的元素

    >>>n2

    []

    修改操作

    >>>names

    ['alex', '黑姑娘', 'rain', 'eva', '狗蛋', '绿毛']>>> names[0] = "金角大王" #修改0上面的元素

    >>> names[-1] = "银角大王" #修改-1上面的元素

    >>>names

    ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王']

    查操作

    >>>names

    ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']>>>

    >>> names.index("eva") #返回从左开始匹配到的第一个eva的索引

    3

    >>> names.count("eva") #返回eva的个数

    2

    切片

    >>>names

    ['金角大王', '黑姑娘', 'rain', 'eva', '狗蛋', '银角大王', 'eva']>>> names[1:4] #不包含下标4的元素

    ['黑姑娘', 'rain', 'eva']>>> names[-5:-1] #倒着切

    ['rain', 'eva', '狗蛋', '银角大王']>>>a

    [0,1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[0:7:2] #设置步长为2

    [0, 2, 4, 6]

    列表反转

    >>> a[::-1] #通过把步长设置成负值,可达到列表返转的效果

    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]>>> a[::-2]

    [9, 7, 5, 3, 1]#同样,在字符串里面也适用

    >>> asd = 'asdfghjkl'

    >>> asd[ : :-1]'lkjhgfdsa'

    排序

    >>> a = [83,4,2,4,6,19,33,21]>>> a.sort() #排序

    >>>a

    [2, 4, 4, 6, 19, 21, 33, 83]

    >>> names=['金角大王', 'rain', '@', '黑姑娘', '狗蛋', "4","#",'银角大王', 'eva']>>> names.sort() #字符根据ASCII排序

    >>>names

    ['#', '4', '@', 'eva', 'rain', '狗蛋', '金角大王', '银角大王', '黑姑娘']

    反转

    >>>names

    ['#', '4', '@', 'eva', 'rain', '狗蛋', '金角大王', '银角大王', '黑姑娘']>>> names.reverse() #反转

    >>>names

    ['黑姑娘', '银角大王', '金角大王', '狗蛋', 'rain', 'eva', '@', '4', '#']

    循环列表

    >>> for i innames:

    ...print(i)

    ...

    黑姑娘

    银角大王

    金角大王

    狗蛋

    rain

    eva

    @4

    #

    元组

    定义

    ()内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素

    特点

    1.可存放多个值

    2.不可变

    3._按照从左到右的顺序定义元组元素,下标从0开始顺序访问,有序

    创建

    ages = (11, 22, 33, 44, 55)#或

    ages = tuple((11, 22, 33, 44, 55))

    常用操作

    #索引

    >>> ages = (11, 22, 33, 44, 55)>>>ages[0]11

    >>> ages[3]44

    >>> ages[-1]55

    #切片:同list#循环

    >>> for age inages:print(age)11

    22

    33

    44

    55

    #长度

    >>>len(ages)5

    #包含

    >>> 11 inages

    True>>> 66 inages

    False>>> 11 not inages

    False

    注意

    元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变

    >>>data

    (99, 88, 77, ['Alex', 'Jack'], 33)>>> data[3][0] = '金角大王'

    >>>data

    (99, 88, 77, ['金角大王', 'Jack'], 33)

    字典(dict)

    定义

    {key1:value1,key2:value2}

    1、键与值用冒号“:”分开;2、项与项用逗号“,”分开;

    info ={"name":"小猿圈","mission": "帮一千万极客高效学编程","website": "http://apeland.com"}

    特性

    key-value结构

    key必须为不可变数据类型、必须唯一

    可存放任意多个value、可修改、可以不唯一

    无序

    查询速度快,且不受dict的大小影响,至于为何快?我们学完hash再解释。创建操作

    创建操作

    >>>person = {"name": "alex", 'age': 20}#或

    >>>person = dict(name='seven', age=20)#或

    >>>person = dict({"name": "egon", 'age': 20})#或

    >>> {}.fromkeys([1,2,3,4,5,6,7,8],100)

    {1: 100, 2: 100, 3: 100, 4: 100, 5: 100, 6: 100, 7: 100, 8: 100}

    增加操作

    names["佩奇"] = [26, "讲师", 40000]

    names.setdefault("oldboy",[50,"boss",100000])#当已经有了value不添加,并返回已有的值

    删除操作

    names.pop("alex") #删除指定key

    names.popitem() #随便删除1个key

    del names["oldboy"] #删除指定key,同pop方法

    names.clear() #清空dict

    修改操作

    dic['key'] = 'new_value'

    #如果key在字典中存在,'new_value'将会替代原来的value值;

    >>> aaa = {1:1,2:2}>>> aaa[1] = 'asd'

    >>>aaa

    {1: 'asd', 2: 2}

    dic.update(dic2)#将字典dic2的键值对添加到字典dic中

    >>> aa = {3:3}>>>aaa.update(aa)>>>aaa

    {1: 'asd', 2: 2, 3: 3}

    查操作

    dic['key'] #返回字典中key对应的值,若key不存在字典中,则报错;

    >>> aaa[1]'asd'dic.get(key, default=None)#返回字典中key对应的值,若key不存在字典中,则返回default的值(默认为None)

    'key' in dic #若存在则返回True,没有则返回False

    dic.keys()#返回一个包含字典所有KEY的列表;

    dic.values()#返回一个包含字典所有value的列表;

    dic.items()#返回一个包含所有(键,值)元组的列表;

    循环

    1、for k in dic.keys() #输出key

    2、for k,v in dic.items() #输出value

    3、for k in dic #推荐用这种,效率速度最快

    info ={"name":"小猿圈","mission": "帮一千万极客高效学编程","website": "http://apeland.com"}for k ininfo:print(k,info[k])

    输出

    name 小猿圈

    mission 帮一千万极客高效学编程

    website http://apeland.com

    求长度

    >>>aaa

    {1: 'asd', 2: 2, 3: 3}>>> len(aaa) #求长度,有几组key-value

    3

    集合

    定义

    {}内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素

    特性

    里面的元素不可变,代表你不能存一个list、dict 在集合里,字符串、数字、元组等不可变类型可以存

    天生去重,在集合里没办法存重复的元素

    无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,如集合{3,4,5}和{3,5,4}算作同一个集合

    创建集合

    >>> a = {1,2,3,4,2,'alex',3,'rain','alex'}>>>a

    {1, 2, 3, 4, 'alex', 'rain'}

    帮列表去重

    >>>b

    [1, 2, 3, 4, 2, 'alex', 3, 'rain', 'alex']>>>set(b)

    {1, 2, 3, 4, 'alex', 'rain'}>>>

    >>> b = list(set(b)) #一句代码搞定

    >>>b

    [1, 2, 3, 4, 'alex', 'rain']

    增删查

    >>>a

    {1, 2, 3, 4, 'alex', 'rain'}#新增

    >>> a.add('黑姑娘')>>>a

    {2, 3, '黑姑娘', 'alex', 'rain'}#删除discard

    >>> a.discard('rain') #删除一个存在的值

    >>> a.discard('rain2') #如果这个值不存在,do nothing.

    >>>a

    {2, 3, '黑姑娘', 'alex'}>>>

    #随机删除,少用,或特定场景用

    >>> a.pop() #删除并返回

    1

    #删除remove

    >>> a.remove(4)#查

    >>>a

    {2, 3, '黑姑娘', 'alex', 'rain'}>>> 'alex' ina

    True

    关系运算

    s_1024 = {"佩奇","老男孩","海峰","马JJ","老村长","黑姑娘","Alex"}

    s_pornhub= {"Alex","Egon","Rain","马JJ","Nick","Jack"}print(s_1024 & s_pornhub) #交集, elements in both set

    print(s_1024 | s_pornhub) #并集 or 合集

    print(s_1024 - s_pornhub) #差集 , only in 1024

    print(s_pornhub - s_1024) #差集, only in pornhub

    print(s_1024 ^ s_pornhub) #对称差集, 把脚踩2只船的人T出去

    print(s_1024.isdisjoint(s_pornhub))#判断2个集合是不是不相交,返回True or False

    print(s_1024.issubset(s_pornhub))#判断s_1024是不是s_pornhub的子集,返回True or False

    print(s_1024.issuperset(s_pornhub))#判断s_1024是不是s_pornhub的父集,返回True or False

    展开全文
  • unsigned charchar 数据类型的区别

    千次阅读 2018-09-03 14:37:55
    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别  首先在内存中,char与unsigned char没有什么不同,都一个字节,唯一的区别char的最高位为符号位,...

    引用:

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 

    首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

    在实际使用过程种有什么区别呢?

    主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

    但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

    首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

    如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

    而如果是unsigned char,那么不会扩展。

    这就是二者的最大区别。

    同理可以推导到其它的类型,比如short, unsigned short。等等

     

    今天就遇到了因为unsigned char 出现的问题

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    	unsigned char c1[1024];
    	char c2[1024];
    	c1[0]=0x1f;
    	c2[0]=0x1f;
    
    	c1[1]=0x8b;
    	c2[1]=0x8b;
    
    	printf("unsigned c1[0]=%02x,c1[1]=%02x\n",c1[0],c1[1]);
    	printf("char c2[0]=%02x,c2[1]=%02x\n",c2[0],c2[1]);
    	
    	
    }
    

    输出答案如下

     

    unsigned c1[0]=1f,c1[1]=8b
    char c2[0]=1f,c2[1]=ffffff8b
    

     

     if 的二进制:‭00011111‬

    8b 的二进制:‭10001011‬

    最高位若为0时,则没有区别

    若最高位为1时,就有区别了

     

    展开全文
  • 在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别首先在内存中,char与unsigned char没有什么不同,都一个字节,唯一的区别char的最高位为符号位,因此...

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别

    首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

    在实际使用过程种有什么区别呢?

    主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

    但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

    首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

    如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

    而如果是unsigned char,那么不会扩展。

    这就是二者的最大区别。

    同理可以推导到其它的类型,比如short, unsigned short。等等

    具体可以通过下面的小例子看看其区别

    include

    void f(unsigned char v)

    {

    char c = v;

    unsigned char uc = v;

    unsigned int a = c, b = uc;

    int i = c, j = uc;

    printf("----------------\n");

    printf("%%c: %c, %c\n", c, uc);

    printf("%%X: %X, %X\n", c, uc);

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

    printf("%%d: %d, %d\n", i, j);

    }

    int main(int argc, char *argv[])

    {

    f(0x80);

    f(0x7F);

    return 0;

    }

    输出结果:

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

    %c: ?, ?

    %X: FFFFFF80, 80

    %u: 4294967168, 128

    %d: -128, 128

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

    %c: ,

    %X: 7F, 7F

    %u: 127, 127

    %d: 127, 127

    由此可见,最高位若为0时,二者没有区别,若为0时,则有区别了。

    展开全文
  • 在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别  首先在内存中,char与unsigned char没有什么不同,都一个字节,唯一的区别char的最高位为符号位,...
  • 什么在Python中没有专门的char数据类型呢?简单胜于复杂。在 Python 中, 字符串中的每个字符占的空间大小 8 bit.>>> import sys>>> sys.getsizeof('')37>>> sys.getsizeof('a')38可以...
  • 在程序设计中经常用到一系列的数据类型,在Java中也一样包含八中数据类型,这八种数据类型又各自对应一种包装器类型。如下表:基本类型包装器类型...
  • 什么在Python中没有专门的char数据类型呢?简单胜于复杂。在 Python 中, 字符串中的每个字符占的空间大小 8 bit.>>> import sys>>> sys.getsizeof('')37>>> sys.getsizeof('a')38可以...
  • 提到这个问题,我们先来做一个-128的原码补码转换(前提假设看到这篇博客的看官会原码补码) ... 补码​ 1 1000 0000(这里为什么会多出来一个1) ​ 在进行原码反码转换的时候,反码从左往右第二个1,加1变
  • 入口处编写的程序char a='a'; char b='b';...,这什么,以前我听说过对应什么编码,什么的,一时没太在意给忘记了,今天有个人问我,我回答不上啊,那个汗颜啊。哪位大神,求解啊。
  • 一、在JAVA中一共有八种基本数据类型,他们分别 byte、short、int、long、float、double、char、boolean整型 color=gray 其中byte、short、int、long都表示整数的,只不过他们的取值范围不一样 byte的取值...
  • 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围...
  • 一、char和varchar类型char和varchar类型类似,都用来存储字符串,但是它们保存和检索字符串的方式不同。char属于固定长度的字符类型,varchar属于可变长度的字符类型。例如:对于char(4)和varchar(4)这两种类型定义...
  • 我们先了解一下能从这篇文章得到些什么JAVA八种基本数据类型整形浮点型字符型布尔型类型转化变量命名规则关键字JAVA中的八种基本数据类型首先在JAVA中有八种基本数据类型JAVA语言已经设定好了的。八种基本数据...
  • java中char类型的默认值到底是什么? 直接po代码和截图 ``` public class TestJavaDataType { //字符型 char flag; //布尔型 boolean sex; /*数值型*/ //整数类型 byte number; short ...
  • 找不到这方法啊,比如rs.getXXX里没有char类型的,String 转成char更不可取,求高手解答,万分感谢
  • 首先请大家想想这几个问题: 1.java数据类型是什么? 2.Java数据类型有什么用?上一节(JAVA基础篇(函数))有个add函数,里面有两个int类型,int类型就是整数的意思,这一节我们来学习java所有的数据类型。JAVA...
  • oracle中char和varchar2数据类型的区别

    千次阅读 2013-01-02 19:36:45
    Oracle中char和varchar2数据类型什么区别?有数据”test”分别存放到char(10)和varchar2(10) 类型的字段中,其存储长度及类型有何区别? 首先解释一下: CHAR的长度固定的,而VARCHAR2的长度可以变化的。...
  • 下图所示保报错信息为不兼容的类型,具体解释从int型转换到byte,可能会有损失.在这里着重要说明一下 可能.说明系统也不确定会不会有损失,索性就很草率的报了错,这就解释了我们明明不超过127,也会报错的原因.然而...
  • varchar,nchar类型区别1、char 类型是一个字节 char(8)只能存8字母,char定长,不足长度加SPACE2、nchar 类型是双字节 nchar(8)能存8个汉字,nchar能包含汉字,包含 n 个字符的固定长度 Unicode 字符数据。...
  • 基本数据类型包括byte、int、char、long、float、double、boolean和short。说到Java的基本数据类型必须谈到的两个类DataInputStream和DataOutputStream。它们提供了对Java基本数据类型的操作,但是这些方法事实...
  • 还有那char表数范围0~65535,这个我觉得因该16位二进制数(没有符号位)表示的最大值。 那这个数值0~65535编码吗(我感觉)? 那0~255不应该8位无符号二进制数算来的吗? 请大神指点,不胜感激。
  • 2.基本数据类型有:int、float、double和char类型。3.对象类型就是类或协议所声明的指针类型,例如:NSAutoreleasePool *pool ,其中,NSAutoreleasePool一个类,NSAutoreleasePool *它指针类型或叫对象类型。4.id...
  • 几乎所有的系统底层都用 C 写的,当时定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等。然后只要碰到一串 01010110010 之类的数据,编译器都可以正确的把它解析...
  • 展开全部varbinary 类型char与varchar类型是相似的,只是他们存储的32313133353236313431303231363533e59b9ee7ad9431333431363564二进制数据,也就是说他们包含字节流而不是字符流,他们有二进制字符的集合和...
  • char是定长字符类型,而varchar是变长字符类型。 有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型? 用char(10)进行存储时,存储被补齐10个空格,其长度为10个字节,而varchar2的...
  • python不支持的数据类型是什么

    千次阅读 2019-12-27 01:59:23
    python不支持的数据类型是什么? python不支持的数据类型char 、byte类型。Python没有char或byte类型来保存单一字符或 8 比特整数。你可以使用长度为 1 的字符串表示字符...
  • 这些数据类型是大家平时工作中一定会用到的,今天不知咋回事,看到这些数据类型时突然产生了一个疑问:数据类型要么有符号的,要么无符号,为什么每种数据类型会多一个缺省的呢?查找资料说是为了移植方便。怎么...

空空如也

空空如也

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

char是什么数据类型