前几天在学习交换群里,有个小伙伴问了一个问题,是对于有符号整数和无符号字符数的运算的问题。对于这部分,我集体了解的也有点问题,当初来做个总结回顾。

有符号整型和无符号数整型

举例

#include <stdio.h>#include <stdlib.h>int main(){    int a = -1;    unsigned int b = 1;    printf("%d", a > b);    return 0;}

  输入后果为:1

解析

  无符号整型和有符号整型比拟时,有符号整型会转化成无符号整型。因而,-1转化为无符号数为0xFFFFFFFF,所以a>b,输入1。

有符号字符型和无符号字符型

举例

#include <stdio.h>#include <stdlib.h>int main(){    char a = -1;    unsigned char b = 1;    printf("%d", a > b);    return 0;}

  输入后果:0

解析

  要解释以上这个景象,首先要明确整型晋升:

  整型晋升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要晋升为int类型,如果int类型不足以示意则要晋升为unsigned int类型;而后执行表达式的运算。

  整型晋升的意义在于:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度个别就是int的字节长度,同时也是CPU的通用寄存器的长度。因而,即便两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的规范长度。通用CPU(general-purpose CPU)是难以间接实现两个8比特字节间接相加运算(尽管机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,而后能力送入CPU去执行运算。(起源百度百科)

  举个例子

#include <stdio.h>#include <stdlib.h>int main(){    char a = '2';    char b = '2';    printf("%d\r\n", sizeof(a+b));        char c = a+b;    printf("%c\r\n", c);    printf("%d\r\n", sizeof(c));        return 0;}

  输入后果为:4 d 1。

  第8行,按理来说应该输入1的,然而这里输入的是4.因为,进行a和b都为char型,a+b时,会将a和b晋升为int型计算,所以会输入4。

  第11行,c为char型,计算a+b时,其实是先晋升为int型,再转换为char型赋值给c,进行了两次类型转换。所以,printf时,c是char型,输入d(ASCII:100)

  同样的,第12行输入的就是1。

  接下来回到本题中,a = -1,晋升为int型为-1,b = 1,晋升为int型为1,所以后果为0。

有符号整型和无符号字符型

举例

#include <stdio.h>#include <stdlib.h>int main(){    int a = -1;    unsigned char b = -1;    printf("%d", a > b);    return 0;}

  输入后果为:0。

解析

  整型晋升,b转化为int型为0xFF,所以a<b。输入0。

有符号字符型和无符号整型

举例

#include <stdio.h>#include <stdlib.h>int main(){    char a = -1;    unsigned int b = -1;    printf("%d\n", a == b);    return 0;}

输入后果:1。

解析

  char类型被扩大为unsigned int后与b相等,同为0xFFFFFFFF

-1源码:1000 0001

-1补码:1111 1111

扩大: 1111 11111111 1111(占用字节小的数据赋值给占用字节大的须要裁减符号位,相同须要截断高位

转为unsigned int:0xFFFF FFFF

转为int: 求扩大后的源码,还须要-1,除去符号位,取反。因而后果为:1000 0000 0000 0001 = -1。

论断

  1.无符号int与有符号int比拟大小,都转化为无符号int来比拟。

  2.int类型与非无符号int的类型比拟时,非无符号int的类型转化为int来比拟。

  3.无符号int类型与其余类型如unsigned short,signed short,unsigned char, char 比拟时,其余类型一律转化为无符号int类型来比拟。

  4.非无符号int类型和非int类型如unsigned short,signed short,unsigned char, char 比拟时,一律转化为int类型来比拟。

  养成习惯,先赞后看!如果感觉写的不错,欢送关注,点赞,在看,转发,谢谢!
如遇到排版错乱的问题,能够通过以下链接拜访我的CSDN。

CSDN:CSDN搜寻“嵌入式与Linux那些事”

欢送欢送关注我的公众号:嵌入式与Linux那些事,支付秋招口试面试大礼包(华为小米等大厂面经,嵌入式知识点总结,口试题目,简历模版等)和2000G学习材料。