#include <iostream>
#include <cstdint>
int main(){
enum class A: std::uint8_t {
_1 = 1,
_2 = 2
};
A a{23};
std::cout<<static_cast<std::uint8_t>(a)<<std::endl;
}
MSYS2 mingw32/gcc 7.1.0版本
g++ a.cpp -o a.exe -std=c++17编译
怎么解释这个结果?
最近编辑记录 xtricman (2017-08-06 18:03:18)
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
不会 C++17。不过我这里是有输出的——输出了一个换行。
离线
不会 C++17。不过我这里是有输出的——输出了一个换行。
倒与17没啥关系吧,我就觉得为啥不输出数字啊
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
你这代码我不指定 C++17 编译不过的。
离线
有输出啊:
$ ./a.out|hexdump
0000000 0a17
0000002
你的终端是不是不显示不可见字符?我这可以看到一个方块啊,0x17,正好是 23,没问题的……如果你的终端不显示不可见字符可以用 hexdump 看看。
最近编辑记录 zsrkmyn (2017-08-07 20:56:30)
离线
有输出啊:
$ ./a.out|hexdump 0000000 0a17 0000002
你的终端是不是不显示不可见字符?我这可以看到一个方块啊,0x17,正好是 23,没问题的……如果你的终端不显示不可见字符可以用 hexdump 看看。
原来是这样!神奇的 C++……
离线
原来是这样!神奇的 C++……
因为本来 uint8_t 就是 char 类型,cout 输出 char 的时候直接输出字符(而不是输出其 ascii 值)。这是可以理解的,比如你写 cout << 'a'; 的时候希望看到的的是 a 而不是 97。
然后凑巧楼主又用了个控制字符。
最近编辑记录 zsrkmyn (2017-08-08 16:28:42)
离线
因为本来 uint8_t 就是 char 类型,cout 输出 char 的时候直接输出字符(而不是输出其 ascii 值)。这是可以理解的,比如你写 cout << 'a'; 的时候希望看到的的是 a 而不是 97。
然后凑巧楼主又用了个控制字符。
所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。
最近编辑记录 依云 (2017-08-08 16:33:06)
离线
因为本来 uint8_t 就是 char 类型
我……无fuck可说,彻底忘了字符类型虽然是整型却有不一样输出语义这件事情
我回去std:: byte再试一下
在测一些C++17的新玩意
论坛编辑器还会检查我qoute标签不对称啦?
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。
它还真的是,来自C99,就是个typedef,C++也带,进入std名字空间
名字空间仅限C++版,毕竟C版的头文件没有namespace
忘了C/C++最基础的一个坑
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。
哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……
离线
依云 说:所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。
哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……
C++ 不能在兼容的同时,让 iostream 对它们区别对待么?
离线
C++的原生scalar类型真是坑
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
C++ 不能在兼容的同时,让 iostream 对它们区别对待么?
是同一个类型啊,这些类型按要求就是整型,那就只能typedef了,不比char 16_t,byte之类的,没有要求是整型
Typedef的根本不可能区别,又不允许新建类型
你像byte就不是整形了
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
zsrkmyn 说:依云 说:所以为什么 uint8_t 是 char……乱糟糟的类型系统啊喵。
哈哈历史遗留问题?因为大概 C 语言本来就只有 char short int long 类型呀,其他都是在 stdint.h 里 typedef 出来的……
C++ 不能在兼容的同时,让 iostream 对它们区别对待么?
不能,因为假设 unsgined int 和 uint16_t 是两种不同的类型,然后写两个函数:
ostream & operator<< (ostream & o, unsigned int arg) {...}
ostream & operator<< (ostream & o, uint16_t arg) {...}
那么写 cout << 16; 的时候,该如何决定调用那个函数呢?
离线