use*_*520 15 c language-lawyer
在这个答案和附带的评论中,Pavel Minaev提出以下论点:在C中,uint8_t
可以使用typedef 的唯一类型是char
和unsigned char
.我正在看这个 C标准草案.
uint8_t
意味着存在相应的类型int8_t
(7.18.1p1).int8_t
是8位宽,没有填充位(7.18.1.1p1).uint8_t
也是8位宽.unsigned char
是CHAR_BIT
位宽(5.2.4.2.1p2和6.2.6.1p3).CHAR_BIT
至少是8(5.2.4.2.1p1).CHAR_BIT
最多为8,因为它们uint8_t
是unsigned char
,或者它unsigned char
是非位域类型,其宽度是CHAR_BIT
(6.2.6.1p4)的倍数.根据这个论点,我同意,如果uint8_t
存在,那么它和它unsigned char
具有相同的表示:8个值位和0个填充位.这似乎并不强迫它们成为同一类型(例如,6.2.5p14).
是否允许对uint8_t
具有相同表示的扩展无符号整数类型(6.2.5p6)进行typedef unsigned char
?当然它必须是typedef'd(7.18.1.1p2),并且它不能是除unsigned char
(或者char
它恰好是无符号)之外的任何标准无符号整数类型.这个假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象的别名访问,这让我觉得编译器编写者想要这样做的原因事情.
如果uint8_t
存在,则无填充要求意味着该数字CHAR_BIT
为8。但是,我没有发现根本原因uint8_t
无法使用扩展整数类型进行定义的根本原因。此外,不能保证表示相同。例如,可以以相反的顺序解释这些位。
尽管这看起来很愚蠢和无聊uint8_t
,但是对于它可能很有意义int8_t
。如果机器本机使用补码或符号/幅度,signed char
则不适合int8_t
。但是,它可以使用扩展的有符号整数类型来模拟double补码来提供int8_t
。
Ani*_*nge -1
int8_t 和 uint8_t 仅在表示形式上有所不同,而在内容(位)上没有区别。int8_t 使用低 7 位作为数据,第 8 位表示“符号”(正或负)。因此int8_t的范围是从-128到+127(0被认为是正值)。
uint8_t 也是 8 位宽,但其中包含的数据始终为正。因此 uint8_t 的范围是从 0 到 255。
考虑到这一事实,char 是 8 位宽。unsigned char 也是 8 位宽,但没有“符号”。同样,short 和 unsigned Short 都是 16 位宽。
然而,如果“ unsigned int
”是8位宽,那么..由于C不太纳粹,所以它是允许的。为什么编译器编写者会允许这样的事情呢?可读性!
归档时间: |
|
查看次数: |
1227 次 |
最近记录: |