回 帖 发 新 帖 刷新版面

主题:[讨论]很简单的问题:关于>>运算符

这是关于 >> 运算符的问题。
>> 运算符在对待有符号数和无符号数好象有差别。

说明: 1. show_char的功能是显示出char类型数在内存中的表示 
       2. show-int 的功能是显示出int 类型数在内存中的表示
       3. windy.h文件在附件中    



[code=c]
#include "stdlib.h"
#include "stdio.h"
#include "windy.h"

#define  Uchar unsigned char
#define  Uint  unsigned int


void ( Show )( char ch,Uchar uch,int i,Uint ui )
{
     printf( "  ch  "   ); show_char( &ch  );
     printf( "\n uch  " ); show_char( &uch );
     printf( "\n   i  " ); show_int ( &i   );
     printf( "  ui  "   ); show_int ( &ui  );
}

void ( RightShift )( char ch,Uchar uch,int i,Uint ui,Uint bits )
{    //右移bits位 
     printf( "\n\nRight Shift %d bits \n",bits ) ;
     Show( ch>>= bits,  uch>>= bits,  i>>= bits,  ui >>= bits );
}  
          
int main( void )
{
    char  ch  = 0x81;
    Uchar uch = 0x81;
    int   i   = 0x80000002;
    Uint  ui  = 0x80000002;   
          
    RightShift( ch,uch,i,ui,0 ); //原始数据 
    RightShift( ch,uch,i,ui,1 ); //右移1位 
    RightShift( ch,uch,i,ui,2 ); //右移2位 
    RightShift( ch,uch,i,ui,3 ); //右移3位 
   
    printf( "\n\n" );
    system( "pause" );
    return 0 ;
}[/code]

回复列表 (共14个回复)

沙发

您的代码太高深了,在下是看不懂.

板凳

对无符号类型,>> 就是无符号右移
比如
00000000000000000000000000000101 右移一位就是 00000000000000000000000000000010,即5变成2
10000000000000000000000000000000 右移一位就是 01000000000000000000000000000000,即2147483648变成1073741824

对有符号类型,>> 就是带符号右移
比如
00000000000000000000000000000101 右移一位就是 00000000000000000000000000000010,即+5变成+2
10000000000000000000000000000000 右移一位就是 11000000000000000000000000000000,即-2147483648变成-1073741824

3 楼

回1楼:windy.h文件是自己用来学习的头文件,没考虑过可读性。其中set开头的函数与这次的无关,其实只有show_char,show_type,show_int这三个函数有关,如show int是用0和1来模拟int类型变量每bit上的值,即int数在内存中的表示。
这些函数是经你上次提醒(低地址存低位)修改后的。我只是觉得把那三个函数复制出来麻烦才把整个文件上传的。只要知道那三个函数的功能就不影响读懂代码。

4 楼

能请教一下你的代码是干什么用的吗?很简单的功能为什么要写的云里雾里的?说实话你这种代码风格如果写大一点的程序的话能行吗?

5 楼

    我觉得我的代码除了花括号的位置不同,其他和通常的差不多,花括号的位置是一开始受《C标准库》里代码的影响。
    windy.h文件是用来学习用的。比如以前对float数的存储方法,函数参数的传递,内存对齐。还有就是对>>运算符的学习。
    对于windy.h里面的函数都很简单。那里面有2类函数:show_ 和 set_ 开头的函数。
[code=c]
         1. show_开头的函数是显示各中类型数据在内存中的表示情况。如有int i=0x0102ff80,那么show_int( &i )将输出 00000001 00000010 11111111 10000000(考虑了低地址存低位) 。其实这一类函数只有2个(show_char和show_type)是基础的,其他的只是把show_type封装好而已。
         2. set_开头的函数是用来通过确定某种类型的每一字节的数来确定这个值。如有  
unsigned char ucArr[ ] ={0xf0,0x11,0x00,0x02};
float f = set_float( 4,ucArr ) ; 
那么f在内存中表示就是 11110000 00010001 00000000 00000010。set_float的原型是
float ( set_float  )( UINT n,UCHAR cArr[ ] );
其中n是表示cArr数组中的元素个数,如果n小于sizeof(float)将返回0。
这类型函数除了set_float和set_double其他都没用。这一类函数只有一个set_type是基础的,其他的只是把它封装好而已。
[/code]

6 楼

我想,强强的意思是楼主使用#define的次数太多了。

7 楼

是楼主故作高深还是我太肤浅,我怎么每次都觉得你写的代码稀奇古怪,请问一下这样的代码究竟有什么意义?

8 楼

对于研究语言是有帮助的:)

如果楼主在调试时用一下反汇编就知道有符号数与无符号数用的是不一样的汇编指令了:)

9 楼

用gcc编译出来的汇编指令和我看的书有点不一样,有时候看不懂。所以没从汇编代码来考虑。

10 楼

[quote]是楼主故作高深还是我太肤浅,我怎么每次都觉得你写的代码稀奇古怪,请问一下这样的代码究竟有什么意义?[/quote]
可能大概应该是我比较肤浅罢

我来回复

您尚未登录,请登录后再回复。点此登录或注册