关于c:不同类型数据运算的总结

47次阅读

共计 2059 个字符,预计需要花费 6 分钟才能阅读完成。

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

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

举例

#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 学习材料。

正文完
 0