char型,有符号or无符号?

下午一个程序测试了好长时间,发现总有一个bug导致内存出错。分析到最后,发现是一个char型的变量,当将其减到小于0时,需要将其重新赋值。但问题就出现在了这里,当其小于0时,并没有进入if语句,将其打印出来,发现值是255,而不是-1。
char s8temp:
ARM平台下的打印信息:
Line: 2
Line: 1
Line: 0
Line: 255
Line: 254
PC平台下:
Line: 2
Line: 1
Line: 0
Line: -1
Line: -2

int s32temp;
ARM 平台下结果:
Line: 2
Line: 1
Line: 0
Line: -1
Line: -2
PC平台下结果:
Line: 2
Line: 1
Line: 0
Line: -1
Line: -2

signed char s8temp
在ARM平台下结果:
Line: 2
Line: 1
Line: 0
Line: -1
Line: -2

  1 #include <stdio.h>
  2 #include <stdint.h>
  3
  4 int main(int arg, char **argv)
  5 {
  6     char s8temp = 30;//signed char s8temp = 30;
  7     //int   s32temp = 30;
  8     unsigned char u8Idx;
  9     for(u8Idx = 0; u8Idx < 60; u8Idx++)
10     {
11         printf("Line: %d\n", s8temp--);
12     }                                                                      
13
14     return 0;
15 }

但是要注意的是char(前面没有限定词)在不同的编译器的实现不一样, 因为标准里没有规定到底该不该有。
这里char型变量,是否有符号,跟具体的编译器有关系。在编程时,为了避免这里的差错,所以在使用char作为有符号型使用时,在其前边加上signed,这样避免以外的bug。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用emu8086编译器编写的输入十个无符号16位二进制数进行排序的程序: ``` ; 用于输入十个无符号16位二进制数进行排序的程序 .model small .stack 100h .data nums db 10 ; 数字的数量 arr dw 0,0,0,0,0,0,0,0,0,0 ; 存储数字的数组 prompt db 'Please enter 10 unsigned 16-bit binary numbers:$' sorted db 'The sorted numbers are:$' .code mov ax, @data mov ds, ax ; 输出提示信息 mov ah, 09h mov dx, offset prompt int 21h ; 循环读取数字 mov cx, nums mov bx, offset arr input: ; 读取输入的数字 mov ah, 01h int 21h ; 将输入的数字转换为二进制 mov ax, bx mov dx, 0 mov si, 0 convert: shr ax, 1 jnc skip or si, 1 skip: shl si, 1 inc dx cmp dx, 16 jl convert ; 将转换后的二进制数存储到数组中 mov [bx], si add bx, 2 ; 判断是否读取完10个数字 dec cx jnz input ; 对数组进行排序 mov cx, nums mov bx, offset arr sort: mov si, bx add si, 2 mov di, si mov ax, [bx] inner_loop: cmp ax, [si] jbe skip_swap mov ax, [si] mov di, si skip_swap: add si, 2 cmp si, bx+20 jne inner_loop ; 交换数字 mov dx, [bx] xchg dx, [di] mov [bx], dx ; 移动到下一个数字 add bx, 2 dec cx jnz sort ; 输出排序后的数字 mov ah, 09h mov dx, offset sorted int 21h mov cx, nums mov bx, offset arr output: ; 输出数字 mov ax, [bx] mov bx, 02h mov cx, 16 print: shl ax, 1 jc one mov dl, '0' jmp print_char one: mov dl, '1' print_char: mov ah, 02h int 21h loop print ; 输出换行符 mov dl, 0dh mov ah, 02h int 21h mov dl, 0ah int 21h ; 移动到下一个数字 add bx, 2 dec nums jnz output ; 退出程序 mov ah, 4ch int 21h end ``` 这个程序会提示用户输入10个无符号16位二进制数,然后将这些数字存储到一个数组中,并对数组进行排序。最后,程序会输出排序后的数字。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值