【数据类型】源码/反码/补码/二分查找、隐式/显式转换,华为面试题

正数:原码 = 反码 = 补码
负数:原码=源码(符号不变) 求反 + 1 = 补码
首位等于符号位
char a = 5; 0000 0101
char b = -5; 1000 0101
反码 0111 1010 求反
补码 0111 1011 +1
1000 0100 求反
源码 1000 0101 +1
CPU只能做加法运算
请添加图片描述
1000 0000 1既是标志位,又是数值位,因此为-128

#include<limits.h>

usigned char无符号是 128 0 — 255
char 符号是 -128 0–127-- -128 – -1

int main()
{
    unsigned char a = 0;
    for (a = 0; a < 128; a++)
    {
        printf("%4d", a);
    }
}
输出 0 --- 127
int main()
{
    char a = 0;
    for (a = 0; a < 128; a++)
    {
        printf("%4d", a);
    }
}
输出 0 -- 127  -128 --- 0 死循环
  • short 短整型有2个字节 16个二进制位
    请添加图片描述
  • 二分查找
int Find_Value(int *nums,int n, int val)
{
    assert(nums != nullptr);
    int pos = -1;
    int left = 0, right = n;
    while (left < right)
    {
        pos = (right - left) / 2 + left;//防止溢出
        if (nums[pos] > val)
        {
            right = pos;
        }
        else if (nums[pos] < val)
        {
            left = pos + 1;
        }
        else
        {
            return pos;
        }
    }
    return -1;// 没找到
}

C语言的类型是不可变的(强类型语言)
即使强转变量的地址,但是其类型没有变,只是看的见的变了。(只能是值得改变)
扩充的是符号位,不会改变其原来的正负值
无符号均扩充0
请添加图片描述
无符号扩展的是 0 不论负值还是正值
有符号,扩展的是符号位,正数符号位为0,负数符号位为1
整型数据值的转换(切片或截取)
从低地址开始切
请添加图片描述
隐式转化规则:
char a = -5 转换为 unsigned int
原码:1000 0101
1111 1010
补码 1111 1011
扩充 1111 1111 1111 1111 1111 1111 1111 1011无符号,很大的值)
与无符号 int b
0000 0000 0000 0000 0000 0000 0000 0000 1010

int main()
{
    char a = -5;
    unsigned int b = 10;
    if (a > b)
    {
        printf("%x>%x", a, b);

    }
    if (a < b)
    {
        printf("%x<%x", a, b);
    }
}

在这里插入图片描述

int main()
{
    for (int i = -4; i < 4u; ++i)
    {             //i会被强转为无符号的整型,其无穷大
        printf("%5d", i);
    }
    return 0;
}

请添加图片描述

  • 华为面试题:
int main()
{
    char c = 128;
    unsigned  char uc = 128;
    unsigned short  us = 0;
    us = c + uc; // 1111 1111 1000 0000
               //   0000 0000 1000 0000
               // 1 0000 0000 0000 0000
    us = (unsigned char)c + uc;
    //0000 0000 1000 0000
    //0000 0000 1000 0000
    //0000 0001 0000 0000
    us = c + (char)uc;
         // 1111 1111 1000 0000;
        //  1111 1111 1000 0000;
        //  1 1111 1111 0000 0000
         //ff00
    us = (unsigned short)c + uc;  
                        //        1111 1111 1000 0000
                        //        0000 0000 1000 0000
                       //       1 0000 0000 0000 0000
    printf("%x", us);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值