关于signed和unsigned、8位、16位、32位整数的比较

eion 2003-04-21 09:17:10
你能不通过计算机,给出下面程序的输出结果吗?

#include <stdio.h>

const unsigned char cu8 = 0xFF;
const unsigned short cu16 = 0xFFFF;
const unsigned long cu32 = 0xFFFFFFFF;

const signed char cs8 = -1;
const signed short cs16 = -1;
const signed long cs32 = -1;

void main(int argc, char* argv[])
{
printf("(%u == %d)\t = %d\n", cu8, cs8, cu8 == cs8);
printf("(%u == %d)\t = %d\n", cu16, cs16, cu16 == cs16);
printf("(%u == %d)\t = %d\n", cu32, cs32, cu32 == cs32);

printf("(%u == %d)\t = %d\n", cu8, cu16, cu8 == cu16);
printf("(%d == %d)\t = %d\n", cs8, cs16, cs8 == cs16);
printf("(%d == %d)\t = %d\n", cs8, cs32, cs32 == cs8);

printf("(%u ^ %d)\t = %d\n", cu8, cs8, (cu8^cs8)==0);
printf("(%u ^ %d)\t = %d\n", cu32, cs32, (cu32^cs32)==0);
printf("(%u ^ %d)\t = %d\n", cs32, cu16, (cs32^cu16)==0);
printf("(%u ^ %d)\t = %d\n", cu32, cs16, (cu32^cs16)==0);
}

问题的关键在于符号位的扩展。
各位请在运行程序前给答案,让大家辩论一下,以增进对符号扩展的理解,OK?
...全文
3234 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
eion 2003-04-24
  • 打赏
  • 举报
回复
屏幕输出的拷贝只能在Win2K下使用,在98,XP下都不行

在Win2K下:
用鼠标选定要拷贝的内容(反白)点击右键就拷贝到剪贴板了
要使用它,就选择“粘贴”或快捷键就行
bigtea 2003-04-23
  • 打赏
  • 举报
回复
附带一小问题,怎样将屏幕输出贴过来?
我的是WIN2K/TC2.0
shishiXP 2003-04-23
  • 打赏
  • 举报
回复
哈,怎么可能?没有计算机,连帖子都看不到。
bigtea 2003-04-23
  • 打赏
  • 举报
回复
我在WIN2K/TC2.0运行楼主的程序,因为WIN2K下为虚拟的16位DOS,所以会截取.
printf("(%u == %d)\t = %d\n", cu32, cs32, cu32 == cs32);
输出为:
(65535 ==-1) = -1

eion 2003-04-22
  • 打赏
  • 举报
回复
printf("(%X == %X)\t = %d\n", signed short(-3), 0xFFFFFFFD, signed short(-3)==0xFFFFFFFD);
printf("(%X == %X)\t = %d\n", unsigned short(-3), 0xFFFD, unsigned short(-3)==0xFFFD);

输出:
(FFFFFFFD == FFFFFFFD) = 1
(FFFD == FFFD) = 1
eion 2003-04-22
  • 打赏
  • 举报
回复
好像有如下规则:

1、长度不相同的两个整数进行运算,短的向长的进行符号扩展(基本上都是先扩展到长整形,具体是有符号还是无符号,我不确定)
2、符号扩展:
2.1 无符号数的扩展:无条件在高位添0,所以无符号的0xFF扩展为长整形为:0x000000FF
2.2 有符号扩展:在所有扩充位添符号位
如果是正数(最高位为0),则在高位添0
如果是负数(最高位为1),则在所有扩充位添1

所以就有了
signed short(-1) = 0xFFFFFFFF
signed short(-2) = 0xFFFFFFFE
signed shrot(-3) = 0xFFFFFFFD

unsigned short(-1)=0x0000FFFF
unsigned short(-2)=0x0000FFFE
unsigned short(-3)=0x0000FFFD

是不是?
eion 2003-04-22
  • 打赏
  • 举报
回复
是挺烦的,我也不是很清楚,希望谁给一个比较完美的解释而已

不过如果将所有的%u和%d都换成%X,我们就可以很清楚的看出答案
(FF == FFFFFFFF) = 0
(FFFF == FFFFFFFF) = 0
(FFFFFFFF == FFFFFFFF) = 1
(FF == FFFF) = 0
(FFFFFFFF == FFFFFFFF) = 1
(FFFFFFFF == FFFFFFFF) = 1
(FF ^ FFFFFFFF) = 0
(FFFFFFFF ^ FFFFFFFF) = 1
(FFFFFFFF ^ FFFF) = 0
(FFFFFFFF ^ FFFFFFFF) = 1

显然是符号扩充的问题
wangyangcheng 2003-04-22
  • 打赏
  • 举报
回复
(255 == -1) = 0
(65535 == -1) = 0
(4294967295 == -1) = 1
(255 == 65535) = 0
(-1 == -1) = 1
(-1 == -1) = 1
(255 ^ -1) = 0
(4294967295 ^ -1) = 1
(4294967295 ^ 65535) = 0
(4294967295 ^ -1) = 1



Data Type Ranges
C/C++ recognizes the types shown in the table below.

Type Name Bytes Other Names Range of Values

int * signed, signed int System dependent

unsigned int * unsigned System dependent

__int8 1 char, signed char –128 to 127

__int16 2 short, short int, signed short int –32,768 to 32,767

__int32 4 signed, signed int –2,147,483,648 to 2,147,483,647

__int64 8 none –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

char 1 signed char –128 to 127
unsigned char 1 none 0 to 255
short 2 short int, signed short int –32,768 to 32,767

unsigned short 2 unsigned short int 0 to 65,535

long 4 long int, signed long int –2,147,483,648 to 2,147,483,647

unsigned long 4 unsigned long int 0 to 4,294,967,295

enum * none Same as int

float 4 none 3.4E +/- 38 (7 digits)

double 8 none 1.7E +/- 308 (15 digits)

long double 10 none 1.2E +/- 4932 (19 digits)





The long double data type (80-bit, 10-byte precision) is mapped directly to double (64-bit, 8- byte precision) in Windows NT and Windows 95.

Signed and unsigned are modifiers that can be used with any integral type. The char type is signed by default, but you can specify /J to make it unsigned by default.

The int and unsigned int types have the size of the system word. This is two bytes (the same as short and unsigned short) in MS-DOS and 16-bit versions of Windows, and 4 bytes in 32-bit operating systems. However, portable code should not depend on the size of int.

Microsoft C/C++ also features support for sized integer types. See __int8, __int16, __int32, __int64 for more information. Also see Integer Limits








用户 昵称 2003-04-22
  • 打赏
  • 举报
回复
最怕做这些题
qiuafa 2003-04-22
  • 打赏
  • 举报
回复
捧场 + 劫分 + 灌水
Andy84920 2003-04-21
  • 打赏
  • 举报
回复
为什么要用带参的main 哪?
Andy84920 2003-04-21
  • 打赏
  • 举报
回复
运行了一下,好像全是错的啦!没有完全正确的!
bigtea 2003-04-21
  • 打赏
  • 举报
回复
这是我的:前六项
(255==-1) =1
(65535==-1) =1
(4294967295==-1) =1
(255==-1) =1
(-1==-1) =1
(-1==-1) =1
eion 2003-04-21
  • 打赏
  • 举报
回复
没人关心?
zhaoao 2003-04-21
  • 打赏
  • 举报
回复
可以呀!
(255 == -1) = 0
(65535 == -1) = 0
(4294967295 == -1) = 1
(255 == 65535) = 0
(-1 == -1) = 1
(-1 == -1) = 1
(255 ^ -1) = 0
(4294967295 ^ -1) = 1
(4294967295 ^ 65535) = 0
(4294967295 ^ -1) = 1
zhaoao 2003-04-21
  • 打赏
  • 举报
回复
up

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧