C/C++ 中如何定义一个1字节的整数(一定要用char吗)?

查看:1226
本文介绍了C/C++ 中如何定义一个1字节的整数(一定要用char吗)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

C/C++ 中整数最短的是short,一般占2个字节,那有没有办法定义一个1字节的整数呢?
如果直接用char的话把它当做数组下标会warning,而且用起来有种种不爽(比如C++中cout一个char只能当做字符输出,阅读代码时容易和真正的字符搞混),有没有办法定义一个1字节整数呢?
typedef char xx 貌似不行

解决方案

如下实现的int8类,应该能满足你的需求。

struct int8 {
  int8() {} // #1
  int8(signed char x) : val(x) {} // #2
  operator int() const {return (int)val;} // #3

  template <class = void>
  operator signed char &() /* & */ {return val;} // #4
  template <class = void>
  operator const signed char &() const {return val;} // #5

  signed char *operator&() {return &val;} // #6
  const signed char *operator&() const {return &val;} // #7

  signed char val;
};

这里列出部分运算细节:

  • 进行数学/逻辑运算时,int8会先由#3转换到int类型,然后进行必要的标准转换(如整型提升),最后进行运算。(为何编译器不选择#4#5见后文)
  • 由其他类型初始化int8时,其他类型会先被隐式转换到signed char类型,然后由#2完成初始化。
  • 由其他类型赋值int8时,其他类型需要先由标准转换转换到signed char类型(注意这里不能是用户定义的转换),然后由构造函数#2从signed char转换到int8类型,最后由(默认)拷贝赋值运算符完成赋值。
  • 作为复合运算左侧运算数时(如+=),int8会由转换函数#4转换成signed char左值,然后完成运算。
  • 由cout流输出int8时,转换函数#3,#4和#5构成重载,但#4和#5是函数模板,所以编译器会选择#3,即转换成int,最终cout按整型输出int8。(详见重载决议
  • 由cin流输入int8时,int8由转换函数#4转换成左值,完成输入。(#3是右值不匹配)

这里,#1#2#3提供对大多数运算的支持。#4#5额外对复合运算符提供支持,并协调cin,cout。而#6#7供参考,可作为fscanf的支持,但cout << &int8;就会出问题。

转换函数#4处被注释的ref-qualifier需要编译器支持C++11,作用是防止int8类型的临时变量被绑定到signed char &。

int8类型的内存结构和signed char一致,可进行内存拷贝。

需要进行位运算时,建议用类似实现的无符号版本。

PS:当然int8和signed char某些时候不一样,不过oj里估计体会不出这些差别。

这篇关于C/C++ 中如何定义一个1字节的整数(一定要用char吗)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆