您的位置:首页 > 其它

char,short,int,long,unsigned,signed

2014-02-25 20:45 429 查看
char, short, int, long, unsigned, signed。
6个关键字可以组合成8种整型类型。
signed char, signed short, signed int, signed long,
unsigned char, unsigned short, unsigned int, unsigned long。

一、如何使用char,short,int,long,unsigned,signed

1、signed和unsigned可以与char, short, int, long一起使用。

     char,short,int,long默认情况下是signed,带符号位的。

2、signed和unsigned也可以单独使用,这种情况下默认为int类型。

3、在XP 32位系统下,Microsoft Visual Stdio 2005 IDE下,各整型类型的长度是:

    sizeof(long) = 4;

    sizeof(int) = 4;

    sizeof(short) = 2;

    sizeof(char) = 1;

4、根据类型所占字节大小,可以分别求出某整型类型的范围。

     signed int  32bits(有符号位,二进制补码)

     故其范围是: [-2^(31), 2^(31) - 1]

     unsigned int 32bits(无符号位)

     范围是:[0, 2^(32) - 1]

     同理你可以递推出char,short,long的范围。

二、整型转换(1)



将整型类型中分成两组,一组是符号型,另一组是无符号。



1、 uy = ux

如果sizeof(ux) > sizeof(uy),则需要对ux的二进制补码进行左截取,再直接赋值。

如果sizeof(ux) = sizeof(uy),则直接赋值。

如果sizeof(ux) < sizeof(uy),则需要对ux的二进制补码进行左添加0,再直接赋值。

unsigned long ul = 0xFFFFFFF0;

unsigned int ui = 0xFFFFFFF0;

unsigned char uc = 0xF0;

unsigned short us;

us = ul;/*us = 0xFFF0 */

us = ui;/*us = 0xFFF0 */

us = uc;/*us = 0x00F0 */

2、uy = sx

如果sizeof(sx) > sizeof(uy), 则需要对sx的二进制补码进行左截取,再直接赋值。

如果sizeof(sx) = sizeof(uy), 则直接赋值。

如果sizeof(sx) < sizeof(uy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。

signed long sl = 0xFFFFFFF0;

signed int si = 0xFFFFFFF0;

signed short ss = 0xFFF0;

signed char sc = 0xF0;

unsigned short us;

us = sl; /*us = 0xFFF0*/

us = si; /*us = 0xFFF0*/

us = ss;/*us = 0xFFF0*/

us = sc;/*us = 0xFFF0*/

3、sy = ux

如果sizeof(ux) > sizeof(sy), 则需要对ux的二进制补码进行左截取,再直接赋值。

如果sizeof(ux) = sizeof(sy), 则直接赋值。

如果sizeof(ux) < sizeof(sy), 则需要对ux的二进制补码进行左添加0,再直接赋值。

unsigned long ul = 0xFFFFFFF0;

unsigned int ui = 0xFFFFFFF0;

unsigned short us = 0xFFF0;

unsigned char uc = 0xF0;

signed short ss;

ss = ul; /*ss = 0xFFF0 */

ss = ui; /*ss = 0xFFF0 */

ss = us;/*ss = 0xFFF0 */

ss = uc;/*ss = 0x00F0 */

4、sy = sx

如果sizeof(sx) > sizeof(sy), 则需要对sx的二进制补码进行左截取,再直接赋值。

如果sizeof(sx) = sizeof(sy), 则直接赋值。

如果sizeof(sx) < sizeof(sy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。

signed long sl = 0xFFFFFFF0;

signed int si = 0xFFFFFFF0;

signed char sc = 0xF0;

signed short ss;

ss = sl; /*ss = 0xFFF0 */

ss = si; /*ss = 0xFFF0*/

ss = sc;/*ss = 0xFFF0*/

二、整型转换(2)

执行赋值操作y_variable = x_variable



1、sizeof(x_variable) > sizeof(y_variable)

对x_variable的二进制补码进行左截取,然后直接赋值。

unsigned int ui = 0xFFFFFFF0;

signed int si = 0xFFFFFFFF0;

unsigned short us;

signed short ss;

us = ui; /*us = 0xFFF0*/

us = si; /*us = 0xFFF0*/

ss = ui; /*ss = 0xFFF0*/

ss = si; /*ss = 0xFFF0*/

2、sizeof(x_variable) = sizeof(y_variable)

直接赋值。

unsigned int ui = 0xFFFFFFF0;

signed int si;

si = ui; /*si = 0xFFFFFFF0*/

3、sizeof(x_variable) < sizeof(y_variable)

对x_variable的二进制补码进行左添加x_variable的符号位,然后直接赋值。

unsigned char uc = 0xF0;
signed char sc = 0xF0;
unsigned short us;
signed short ss;
us = uc;/*us = 0x00F0*/
us = sc;/*us = 0xFFF0*/
ss = uc;/*ss = 0x00F0*/
ss = sc;/*ss = 0xFFF0*/

三、算术类型转换

如果计算表达式中各个变量的类型不同,如何计算该表达式?

1、如果任何一个操作数为long double类型,则将另一个操作数转换为long double类型。

2、否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。

3、否则,如果任何一个操作数为float类型,则将另一个操作数转换为float类型。

4、否则,如果任何一个操作数为unsigned long类型,则将另一个操作数转换为unsigned long。

5、否则,如果一个操作数为long类型且另一个操作数为unsigned int类型,则结果依赖于

long类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int 类型的操作数

转换为long类型;如果不可以,则将两个操作数都转换为unsigned long类型。

6、否则,如果一个操作数为long类型,则将另一个操作数转换为long类型。

7、否则,如果一个操作数为unsigned int 类型,则将另一个操作数转换为unsigned int类型。

8、否则,将两个操作数都转换为int类型。

注意1:在规则8中,将两个操作数都转换为int类型。如果操作数中有enum,char,short,则

一律将其转换为int类型,做整型运算。

注意2:在这里不包含强制类型转换。

本人现经营一个微信订阅号如下:欢迎大家关注,获取相关内容。

订阅号账号是:begginghard_zgh

订阅号名称是:读书笔记 By 张光辉

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息