1.习题一
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
结果为 -1 -1 255
(1)a:char(有符号)
源码 : 10000000000000000000000000000001 (第一个1为符号位)
反码 : 1111111111111111111111111111111111110 (符号位不动,其他取反)
补码: 1111111111111111111111111111111111111 (反码+1)
因为char只能读取一个字节,即8个bit位
所以a存储 11111111
因为要打印%d(有符号整数) 所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’)
a:11111111111111111111111111111111
打印%d(有符号整数)所以a视为有符号数的补码;
源码为: 10000000000000000000000000000001
打印出来为-1;
(3)
a:unsigned char(无符号)
源码 : 10000000000000000000000000000001 (第一个1为符号位)
反码 : 1111111111111111111111111111111111110 (符号位不动,其他取反)
补码: 1111111111111111111111111111111111111 (反码+1)
因为char只能读取一个字节,即8个bit位
所以a存储 11111111 (注意第一个‘1”不是符号位,因为是unsigned char(无符号)
要打印%d(有符号整数)
补’0‘
00000000000000000000000011111111
打印%d(有符号整数)所以a视为无符号数的源码;
打印出来为255;
2.习题二
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
} //代码1
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
} //代码2
代码1:
a:char(有符号)
源码 : 10000000000000000000000010000000 (第一个1为符号位)
反码 : 1111111111111111111111111111011111111 (符号位不动,其他取反)
补码: 1111111111111111111111111111110000000 (反码+1)
因为char只能读取一个字节,即8个bit位
所以a存储 10000000
因为要打印%u(无符号整数)所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’)
11111111111111111111111110000000;
打印%u(无符号整数)所以a视为无符号数的源码;
打印出来为:4294967168
代码2:
源码 : 00000000000000000000000010000000 (正数源反补一致)
补码: 00000000000000000000000010000000
因为char只能读取一个字节,即8个bit位
所以a存储 10000000
因为要打印%u(无符号整数)所以需要整形提升(按照a的类型补数据,a为char,补符号位的‘1’,若为unsign char 则需要补‘0’)
11111111111111111111111110000000;
打印%u(无符号整数)所以a视为无符号数的源码;
打印出来为:4294967168
3.习题三
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
size_t a = 0; 相当于unsigned int
int b = 2;
while (b >= a)
{
cout << b << endl;
b--;
}
return 0;
}
注意 在操作符的两边,若变量类型不一致,也会发生类型提升
第一次循环,b被类型提升为size_t,(x64下8个字节,x32下4个字节)
注意:当b经历几轮循环后变成-1时
源码 : 10000000000000000000000000000001 (第一个1为符号位)
反码 : 1111111111111111111111111111111111110 (符号位不动,其他取反)
补码: 1111111111111111111111111111111111111 (反码+1)
转变为size_t(以4个字节为例)不需要补充 所以b视为无符号数的源码;
4294967295;
会导致无限循环