c++-打印有符号和无符号char的区别

问题描述

打印有符号和无符号char的区别

写了这样一段代码,想要将数据按字节打印。(小端机器)

 #include <stdio.h>

typedef char * byte_pointer;

void show_bytes(byte_pointer data, int len)
{
    int i = 0;
    for (i=0; i<len; ++i)
    {
        printf("0x%.2x ", data[i]);
    }
    printf("n");
}

void main()
{
    int x = -2;
    show_bytes((byte_pointer)&x, sizeof(int));
    int xx = x>>2;
    show_bytes((byte_pointer)&xx, sizeof(int));
    return;
}

打印结果为:
luocanwei@luocanwei-Aspire-5750G:~/computer systems$ ./test
0xfffffffe 0xffffffff 0xffffffff 0xffffffff
0xffffffff 0xffffffff 0xffffffff 0xffffffff

这不是我想要的,改为

typedef unsigned char * byte_pointer;

才是我要的结果:
luocanwei@luocanwei-Aspire-5750G:~/computer systems$ ./test
0xfe 0xff 0xff 0xff
0xff 0xff 0xff 0xff

到底打印单字节有符号的char时,为什么会出现打印成32位数据;而如果是无符号则不会?难道声明为无符号打印,打印“%x”也是无符号?求指导,谢谢。

解决方案

%x 其实接收的是 unsigned int,4字节。所以用 char/unsigned char 会有类型提升的问题,有符号的 0xff 提升为 0xffffffff、0xfe 提升为 0xfffffffe,无符号的 0xff 提升为 0x000000ff、0xfe 提升为 0x000000fe。

解决方案二:

有符号数右移,高位补1,无符号数补0。
关键是>>2

时间: 2024-08-18 09:46:55

c++-打印有符号和无符号char的区别的相关文章

深入分析C语言中的有符号和无符号

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型. (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型. 字符类型也分为有符和无符类型. 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型. 2.使用二制数中的最高位表

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; }  答案是:>6   第二题 #include<stdio.h> 

C语言的无符号数据类型转换

从网络中读取C的无符号int,short,byte字节数组,相应转换成java的long,char,short short anUnsignedByte = 0; char anUnsignedShort = 0; long anUnsignedInt = 0; int firstByte = 0; int secondByte = 0; int thirdByte = 0; int fourthByte = 0; byte buf[] = getNetData();//如:读网络字节数据 in

可用于数论计算的无符号大整数类

前些日子,无意中访问到三思科学网,里面介绍了许多数论问题,这也是我儿时的爱好,于是就利用空闲时间编写了一个用于数论计算的无符号大整数类. 一.类的基本结构Class CUSuperInt { public: //构造及析构函数 CUSuperInt(); CUSuperInt(DWORD dwValue); CUSuperInt(char* pszVal); CUSuperInt(CUSuperInt& x); virtual ~CUSuperInt(); protected: DWORD *p

C语言参考程序—无符号一位整数的四则运算

题目:输入一个无符号的一位整数的四则运算表达式,输出其结果.例如输入:1+3*6-2,则输出:17 分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算.在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来.没有的话就将加减运算符先存起来. 主要过程: 1.输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储.数据和运算符需要分开处理. 2.引入一个整型的数组,其大小为字符串长度加一,

C语言之将无符号字符型转化为ascii码值

这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0  到 127 来表示 .那就对了, 0 到 127 不就是 128个字符吗. 每一个数字都代表一个字符.看ASCII 编码表 我们来看看代码: #include <stdio.h> #include <stdlib.h> #define toascii(c) (((unsigned char)(c))&0x7

编程-汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数

问题描述 汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数 汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数.转换算法可以是:用二进制数除以10000,商为"万位",再用余数除以1000,得到"千位":依次用余数除以100.10和1,得到"百位"."十位"和"个位" 解决方案 unsigned int ui;//(16位无符号二进制数) unsigned

《C和C++程序员面试秘笈》——1.6 看代码写结果—有符号变量与无符号变量的值的转换

1.6 看代码写结果-有符号变量与无符号变量的值的转换 C和C++程序员面试秘笈考点: 有符号变量与无符号变量的区别和联系 出现频率: #include <stdio.h> char getChar(int x, int y) { char c; unsigned int a = x; (a + y > 10)? (c = 1): (c = 2); return c; } int main(void) { char c1 = getChar(7, 4); char c2 = getCha

PHP中把有符号整型转换为无符号整型方法

  这篇文章主要介绍了PHP中把有符号整型转换为无符号整型方法,转换的方法很简单,本文直接给出转换方法,需要的朋友可以参考下 在一个短地址项目中,根据六位字符与ID的相互映射的算法,当ID超过2147483647的时候,六位字符的短地址映射的ID变成有符号的整型. 代码如下: ID > 六位字符 >映射ID ID: 2147483644 > TfffVQ > 2147483644 ID: 2147483645 > efffVQ > 2147483645 ID: 2147