zoukankan      html  css  js  c++  java
  • 一道int和unsigned char之间强制类型转换的题目

    设有语句:

    ```

    int a=258,b;

    unsigned char c;

    b=c=a;

    ```

    则b的值为___。

    (答案:2)

    (一)int 类型和char类型之间强制类型转换的规则

    ```将int类型变量i的值赋给char类型变量c,会将i的值当作一个ascii码赋给c。

    int a=51;

    char c=a;

    cout<<c<<endl;

    ```

    输出结果是3

    ```将char类型变量c的值赋给int类型变量i,会将c中存储的字符的ascii码当作一个整型数赋给i。

    char c='a';

    int a=c;

    cout<<a<<endl;

    ```

    输出结果是97

    (二)此题中用的是unsigned char,它和char有什么区别呢?

    以下内容摘自博客园 https://www.cnblogs.com/dpf-learn/p/6109012.html

    在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 <stdio.h>

    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); //D128 B1000,0000,ascii=128对应的符号: &Ccedil;

    f(0x7F); //D127 B0111,1111

    return 0;

    }

    ```

    输出结果:

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

    %c: ?, ?

    %X: FFFFFF80, 80

    %u: 4294967168, 128

    %d: -128, 128

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

    %c: ,

    %X: 7F, 7F

    %u: 127, 127

    %d: 127, 127

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

    对了,再补充一点:关于1000,0000=128

    负数在计算机内用补码表示:符号位不变,其余数字依次取反再加1。故其补码:1,1000,0000 ,就是-128。

    (三)关于此题解释

    int a=258,对应B=1,0000,0010

    c=a=258,理论上来说是把258当成ascii码赋值给c了,可是ascii码是0~255,另外unsigned的值范围也就是0~255,此处发生了溢出,所以c=(1),0000,0010,D=2。

    此时,c中存储的ascii码为2,赋值给b时,将ascii码当作一个整型数赋给b,所以b=2

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/yigeqiu/p/10068554.html
Copyright © 2011-2022 走看看